学海无涯

导航

MVC Core CURD

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Threading.Tasks;
  5 using Microsoft.AspNetCore.Mvc;
  6 using Microsoft.AspNetCore.Mvc.Rendering;
  7 using Microsoft.EntityFrameworkCore;
  8 using MvcMovie.Data;
  9 using MvcMovie.Models;
 10 
 11 namespace MvcMovie.Controllers
 12 {
 13     public class MoviesController : Controller
 14     {
 15         private readonly MvcMovieContext _context;
 16 
 17         public MoviesController(MvcMovieContext context)
 18         {
 19             _context = context;
 20         }
 21 
 22         // GET: Movies
 23         public async Task<IActionResult> Index(string movieGenre, string searchString)
 24         {
 25             if (_context.Movie == null)
 26             {
 27                 return Problem("没有设置数据库上下文实体");
 28             }
 29             IQueryable<string> genreQuery = from m in _context.Movie orderby m.Genre select m.Genre;
 30             var movies = from m in _context.Movie select m;
 31             if (!string.IsNullOrEmpty(searchString))
 32             {
 33                 movies = movies.Where(m => m.Title!.Contains(searchString));
 34             }
 35             if (!string.IsNullOrEmpty(movieGenre))
 36             {
 37                 movies = movies.Where(m => m.Genre == movieGenre);
 38             }
 39             var movieGenreVM = new MovieGenreViewModel
 40             {
 41                 Genres = new SelectList(await genreQuery.Distinct().ToListAsync()),
 42                 Movies = await movies.ToListAsync(),
 43             };
 44             return View(movieGenreVM);
 45         }
 46 
 47         // GET: Movies/Details/5
 48         public async Task<IActionResult> Details(int? id)
 49         {
 50             if (id == null || _context.Movie == null)
 51             {
 52                 return NotFound();
 53             }
 54 
 55             var movie = await _context.Movie
 56                 .FirstOrDefaultAsync(m => m.Id == id);
 57             if (movie == null)
 58             {
 59                 return NotFound();
 60             }
 61 
 62             return View(movie);
 63         }
 64 
 65         // GET: Movies/Create
 66         public IActionResult Create()
 67         {
 68             return View();
 69         }
 70 
 71         // POST: Movies/Create
 72         // To protect from overposting attacks, enable the specific properties you want to bind to.
 73         // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
 74         [HttpPost]
 75         [ValidateAntiForgeryToken]
 76         public async Task<IActionResult> Create( Movie movie)
 77         {
 78             if (ModelState.IsValid)
 79             {
 80                 _context.Add(movie);
 81                 await _context.SaveChangesAsync();
 82                 return RedirectToAction(nameof(Index));
 83             }
 84             return View(movie);
 85         }
 86 
 87         // GET: Movies/Edit/5
 88         public async Task<IActionResult> Edit(int? id)
 89         {
 90             if (id == null || _context.Movie == null)
 91             {
 92                 return NotFound();
 93             }
 94 
 95             var movie = await _context.Movie.FindAsync(id);
 96             if (movie == null)
 97             {
 98                 return NotFound();
 99             }
100             return View(movie);
101         }
102 
103         // POST: Movies/Edit/5
104         // To protect from overposting attacks, enable the specific properties you want to bind to.
105         // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
106         [HttpPost]
107         [ValidateAntiForgeryToken]
108         public async Task<IActionResult> Edit(int id, [Bind("Id,Title,Date,ReleaseDate,Genre,Price,Rating")] Movie movie)
109         {
110             if (id != movie.Id)
111             {
112                 return NotFound();
113             }
114 
115             if (ModelState.IsValid)
116             {
117                 try
118                 {
119                     _context.Update(movie);
120                     await _context.SaveChangesAsync();
121                 }
122                 catch (DbUpdateConcurrencyException)
123                 {
124                     if (!MovieExists(movie.Id))
125                     {
126                         return NotFound();
127                     }
128                     else
129                     {
130                         throw;
131                     }
132                 }
133                 return RedirectToAction(nameof(Index));
134             }
135             return View(movie);
136         }
137 
138         // GET: Movies/Delete/5
139         public async Task<IActionResult> Delete(int? id)
140         {
141             if (id == null || _context.Movie == null)
142             {
143                 return NotFound();
144             }
145 
146             var movie = await _context.Movie
147                 .FirstOrDefaultAsync(m => m.Id == id);
148             if (movie == null)
149             {
150                 return NotFound();
151             }
152 
153             return View(movie);
154         }
155 
156         // POST: Movies/Delete/5
157         [HttpPost, ActionName("Delete")]
158         [ValidateAntiForgeryToken]
159         public async Task<IActionResult> DeleteConfirmed(int id)
160         {
161             if (_context.Movie == null)
162             {
163                 return Problem("Entity set 'MvcMovieContext.Movie'  is null.");
164             }
165             var movie = await _context.Movie.FindAsync(id);
166             if (movie != null)
167             {
168                 _context.Movie.Remove(movie);
169             }
170 
171             await _context.SaveChangesAsync();
172             return RedirectToAction(nameof(Index));
173         }
174 
175         private bool MovieExists(int id)
176         {
177             return (_context.Movie?.Any(e => e.Id == id)).GetValueOrDefault();
178         }
179     }
180 }
 1 using System.ComponentModel.DataAnnotations;
 2 using System.ComponentModel.DataAnnotations.Schema;
 3 
 4 namespace MvcMovie.Models
 5 {
 6     public class Movie
 7     {
 8         public int Id { get; set; }
 9         [StringLength(60,MinimumLength =3)]
10         [Required]
11         public string? Title { get; set; }
12         [Display(Name ="Release Date")]
13         [DataType(DataType.Date)] 
14         public DateTime ReleaseDate { get; set; }
15         [RegularExpression(@"^[A-Z]+[a-zA-Z\s]*$")]
16         [Required]
17         [StringLength(30)]
18         public string? Genre { get; set; }
19         [Range(1,100)]
20         public decimal Price { get; set; }
21         [RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$")]
22         [StringLength(5)]
23         [Required]
24         public string? Rating { get; set; }
25     }
26 }
 1 using Microsoft.AspNetCore.Mvc.Rendering;
 2 
 3 namespace MvcMovie.Models
 4 {
 5     /// <summary>
 6     /// 电影流派
 7     /// </summary>
 8     public class MovieGenreViewModel
 9     {
10         public List<Movie>? Movies { get; set; }
11         public SelectList? Genres { get; set; }
12         public string? MovieGenre { get; set; }
13         public string? SearchString { get; set; }
14     }
15 }
@model MvcMovie.Models.Movie

@{
    ViewData["Title"] = "Create";
}

<h1>Create</h1>

<h4>Movie</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Title" class="control-label"></label>
                <input asp-for="Title" class="form-control" />
                <span asp-validation-for="Title" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ReleaseDate" class="control-label"></label>
                <input asp-for="ReleaseDate" class="form-control" />
                <span asp-validation-for="ReleaseDate" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Genre" class="control-label"></label>
                <input asp-for="Genre" class="form-control" />
                <span asp-validation-for="Genre" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Price" class="control-label"></label>
                <input asp-for="Price" class="form-control" />
                <span asp-validation-for="Price" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Rating" class="control-label"></label>
                <input asp-for="Rating" class="form-control"/>
                <span asp-validation-for="Rating" class="text-danger"></span>
            </div>
            <br/>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
@model MvcMovie.Models.Movie

@{
    ViewData["Title"] = "Delete";
}

<h1>Delete</h1>

<h3>Are you sure you want to delete this?</h3>
<div>
    <h4>Movie</h4>
    <hr />
    <dl class="row">
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Genre)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Genre)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Price)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Price)
        </dd>
    </dl>
    
    <form asp-action="Delete">
        <input type="hidden" asp-for="Id" />
        <input type="submit" value="Delete" class="btn btn-danger" /> |
        <a asp-action="Index">Back to List</a>
    </form>
</div>
@model MvcMovie.Models.Movie

@{
    ViewData["Title"] = "Details";
}

<h1>Details</h1>

<div>
    <h4>Movie</h4>
    <hr />
    <dl class="row">
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Genre)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Genre)
        </dd>
        <dt class = "col-sm-2">
            @Html.DisplayNameFor(model => model.Price)
        </dt>
        <dd class = "col-sm-10">
            @Html.DisplayFor(model => model.Price)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model=>model.Rating)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model=>model.Rating)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model?.Id">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>
@model MvcMovie.Models.Movie

@{
    ViewData["Title"] = "Edit";
}

<h1>Edit</h1>

<h4>Movie</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Edit">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="Id" />
            <div class="form-group">
                <label asp-for="Title" class="control-label"></label>
                <input asp-for="Title" class="form-control" />
                <span asp-validation-for="Title" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="ReleaseDate" class="control-label"></label>
                <input asp-for="ReleaseDate" class="form-control" />
                <span asp-validation-for="ReleaseDate" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Genre" class="control-label"></label>
                <input asp-for="Genre" class="form-control" />
                <span asp-validation-for="Genre" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Price" class="control-label"></label>
                <input asp-for="Price" class="form-control" />
                <span asp-validation-for="Price" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Rating" class="control-label"></label>
                <input asp-for="Rating" class="form-control"/>
                <span asp-validation-for="Rating" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
@model MvcMovie.Models.MovieGenreViewModel

@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>
<form asp-controller="Movies" asp-action="Index" method="get">
    <p>
        <select asp-for="MovieGenre" asp-items="Model.Genres">
            <option value="">All</option>
        </select>
        Title: <input type="text" name="SearchString" />
        <input type="submit" value="查询" />
    </p>
</form>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Movies!.First().Title)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies!.First().ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies!.First().Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Movies!.First().Price)
            </th>
            <th>
                @Html.DisplayNameFor(model=>model.Movies!.First().Rating)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Movies!)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Title)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.ReleaseDate)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Genre)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Price)
                </td>
                <td>
                    @Html.DisplayFor(modelItem=>item.Rating)
                </td>
                <td>
                    <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                    @Html.ActionLink("查看详情","Details",new{Id=item.Id})
                </td>
            </tr>
        }
    </tbody>
</table>

 

posted on 2023-02-10 17:02  宁静致远.  阅读(13)  评论(0编辑  收藏  举报