1

我仍在学习有关 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");
}

我倾向于第二种情况,因为我不需要创建新实体并将其传递给视图。我想这就是我问你们的原因,有人曾经告诉我没有“愚蠢的问题”,所以我希望你们能忍受我:)

  1. 我是否需要将新创建的 Derpina 传递给视图
  2. 第二种情况不是“最佳实践”吗?
  3. 在第三种情况下,如果我将 Derpina 作为参数传递给 HttpPost 函数,MVC 框架是否尚未更新模型?

英语不是我的母语,所以我希望这些问题有意义。无论如何,提前感谢您提供的任何帮助,以便我澄清。

已编辑

在收到一个答案后,我想添加第四个场景:

public ActionResult CreateDerp()
{
    return View();
}

[HttpPost]
public ActionResult CreateDerp(Derpina derpina)
{
    UpdateModel(derpina);
    //doStuff and save to DB
    return RedirectToAction("Index");
}

这是否是正确的方法,我的意思是如果我不需要在 GET 函数中将模型发送到视图?例如,如果我使用上面代码建议的 Create 函数。

4

2 回答 2

3

第一个问题 -> 如果您的视图必须显示数据库中的数据,则需要将模型发送到视图,以便它可以在您的页面上显示所需的数据。

第二个问题->在发布时,如果不需要将模型作为发布方法中的参数,则始终建议使用它,这就是模型绑定器的全部目的,如何更新数据库中的数据应该在业务中分开在我看来,这是最干净的方式。

第三个问题-> mvc 框架确实创建了一个新模型,其中包含您视图中的数据(如果用户输入了任何数据),但这并不意味着它会自动更新您的对象或应用数据库中的更改,您必须这样做明确地,您需要它的方式。

我希望我至少有点帮助。

于 2012-09-05T16:51:55.030 回答
1

问题1:如果您正在初始化一些值(例如在构造函数中),您只需要将一个新实例传递给视图。

问题 2:如果您创建一个新的 Derpina 实例,您将无法获得用户输入的值。您需要像场景 3 一样将 Derpina 的实例传递给 Derp 方法。

问题3:你不需要调用UpdateModel(),但是你应该检查模型状态(ModelState.IsValid)然后执行你的业务逻辑并将模型保存到数据库中。

于 2012-09-05T17:53:33.477 回答