前面介绍过,页面可以通过提交参数的方式,控制器通过参数方式接收,但是只介绍了基本的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 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 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);
}