前面介绍过,页面可以通过提交参数的方式,控制器通过参数方式接收,但是只介绍了基本的string、int类型。如果页面字段较多,实际上可以对应一个类的话,应该如何快速的处理呢?
https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-mvc-app/controller-methods-views?view=aspnetcore-3.1
我们看MovieController.cs文件,其中有两个Edit方法,一个是针对http get,另一个是针对http post。
// GET: Movies/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}
var movie = await _context.Movie.FindAsync(id);
if (movie == null)
{
return NotFound();
}
return View(movie);
}
以上方法,页面提交了一个id参数,通过id,获取对应的movie对象并显示到页面上。 此时客户页面显示的Edit.cshtml,该页面中是一个form对象,点击按钮会按照http post方式提交给movieController的Edit方法,同时提交多个参数,比如Title、Genere、Price等。 再看控制器的另一个Edit方法,其中参数部分通过Bind方式,将多个参数映射到一个Movie对象上,这样控制器处理就更方便了。如果不用Bind,则需要逐个把参数写上去,有点繁琐。
// POST: Movies/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{
if (id != movie.ID)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(movie);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MovieExists(movie.ID))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction("Index");
}
return View(movie);
}