C# ASP.NET MVC NerdDinner教程问题
我正在学习Scott Guthries的MVC教程(),但有一点我不明白 名为DinnersController的控制器类具有以下创建方法:C# ASP.NET MVC NerdDinner教程问题,c#,asp.net-mvc,C#,Asp.net Mvc,我正在学习Scott Guthries的MVC教程(),但有一点我不明白 名为DinnersController的控制器类具有以下创建方法: public ActionResult Create() { Dinner dinner = new Dinner() { EventDate = DateTime.Now.AddDays(7) }; return View(new DinnerFor
public ActionResult Create()
{
Dinner dinner = new Dinner()
{
EventDate = DateTime.Now.AddDays(7)
};
return View(new DinnerFormViewModel(dinner));
}
[AcceptVerbs( HttpVerbs.Post)]
public ActionResult Create(Dinner dinner)
{
if (ModelState.IsValid)
{
try
{
dinner.HostedBy = "SomeUser";
dinnerRepository.Add(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
catch
{
foreach (var violation in dinner.GetRuleViolations())
ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage);
}
}
return View(new DinnerFormViewModel(dinner));
}
第一个方法导致显示页面Create.aspx,该页面显示对象类型“DinnerViewFormModel”的表单数据,即
类“DinnerViewFormModel”包含一个名为“Dinner”的属性,因此显示Dinner类型对象的相关信息是通过调用:
标题:
我知道目前发生了什么。但是,Create.aspx包含一个提交类型按钮:
单击按钮时,将调用以下方法:
[AcceptVerbs( HttpVerbs.Post)]
public ActionResult Create(Dinner dinner)
我不明白的是,如果表单的模型数据是“DinnerViewFormModel”对象,MVC如何知道需要将什么“Dinnerve”对象传递给Create方法
请有人给我点化一下好吗?多亏了AFAIK,MVC只是尝试将POST中可用的属性映射到它提供的参数。因此,它不需要知道类型,只需使用默认构造函数创建对象,并将表单值映射到创建的对象,这就是作为方法参数值得到的结果
顺便说一句:您还将注意到视图输出不包含任何对
Dinner
或dinnePerformViewModel
类的引用。它被称为“模型绑定”,并内置于ASP.NET MVC中。您的操作方法需要数据,而传入的HTTP请求携带您需要的数据。关键在于数据被嵌入到POST表单值中,可能还有URL本身。输入DefaultModelBinder,它可以神奇地将表单值和路由数据转换为对象。模型绑定器允许您的控制器代码与询问请求及其相关环境的脏污保持干净的分离。Ok,这是有意义的。我知道必须有一个直截了当的答案。谢谢你的帮助,我想这是一篇很好的关于这个主题的博文。