我还在学习MVC编程的方法,并且有一个问题要向我澄清一下我控制器中的Get和POST ActionResult函数。我会给你三种可能的场景(实际上是三个问题):
我的第一个场景:
public ActionResult Derp()
{
Derpina derpina = new Derpina(); //Should I need to pass this to View?
return View(derpina);
}
[HttpPost]
public ActionResult Derp()
{
Derpina derpina = new Derpina();
UpdateModel(derpina);
//doStuff and save to DB
return RedirectToAction("Index");
}
我的第二个场景:
public ActionResult Derp()
{
return View();
}
[HttpPost]
public ActionResult Derp()
{
Derpina derpina = new Derpina(); //Is this the cleanest way?
UpdateModel(derpina);
//doStuff and save to DB
return RedirectToAction("Index");
}
我的第三个场景:
public ActionResult Derp()
{
Derpina derpina = new Derpina();
return View(derpina);
}
[HttpPost]
public ActionResult Derp(Derpina derpina)
{
UpdateModel(derpina); //Should I need to do that at all?
//doStuff and save to DB
return RedirectToAction("Index");
}
我倾向于第二种情况,因为我不需要创建新实体并将其传递给View。我想这就是为什么我问你们,有人告诉我,没有“愚蠢的问题”,所以我希望你能忍受我:)
英格利斯不是我的母语所以我希望这些问题有意义。无论如何,请提前感谢您提供任何帮助,以便澄清。
EDITED
我收到一个答案后,我想添加第四个场景:
public ActionResult CreateDerp()
{
return View();
}
[HttpPost]
public ActionResult CreateDerp(Derpina derpina)
{
UpdateModel(derpina);
//doStuff and save to DB
return RedirectToAction("Index");
}
这是正确的方法吗,我的意思是如果我不需要将模型发送到GET函数中的View?例如,如果我使用上述代码建议的创建函数。
答案 0 :(得分:3)
第一个问题 - >如果您的视图必须显示数据库中的数据,则需要将模型发送到视图,以便它可以在页面上显示所需的数据。
第二个问题 - >在帖子中,如果不需要将模型作为post方法中的参数,则总是建议使用,这就是模型绑定器的整个目的,如何更新数据库中的数据应该在应用程序的bussines层中分离,在我看来,这是最干净的方式。
第3个问题 - > mvc框架确实创建了一个包含视图中数据的新模型(如果用户输入了任何数据),但是,这并不意味着它会自动更新您的对象或在数据库中应用更改,您必须明确地这样做,你需要它。
我希望我至少有点帮助。
答案 1 :(得分:1)
问题1:如果要初始化某些值(例如在构造函数中),则只需要将新实例传递给View。
问题2:如果您创建Derpina的新实例,则不会获得用户输入的值。您需要将Derpina的实例传递到Derp方法,如方案3中所示。
问题3:您不需要调用UpdateModel()
,但应检查模型状态(ModelState.IsValid
),然后执行业务逻辑并将模型保存到数据库中。