用于在控制器中创建函数的MVC最佳实践

时间:2012-09-05 16:45:27

标签: c# asp.net-mvc

我还在学习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。我想这就是为什么我问你们,有人告诉我,没有“愚蠢的问题”,所以我希望你能忍受我:)

  1. 我是否需要将新创建的Derpina传递给View
  2. 第二种情况不是“最佳做法”吗?
  3. 在第三种情况下,如果我将Derpina作为参数传递给HttpPost函数,MVC框架是否尚未更新模型?
  4. 英格利斯不是我的母语所以我希望这些问题有意义。无论如何,请提前感谢您提供任何帮助,以便澄清。

    EDITED

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

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

    这是正确的方法吗,我的意思是如果我不需要将模型发送到GET函数中的View?例如,如果我使用上述代码建议的创建函数。

2 个答案:

答案 0 :(得分:3)

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

第二个问题 - >在帖子中,如果不需要将模型作为post方法中的参数,则总是建议使用,这就是模型绑定器的整个目的,如何更新数据库中的数据应该在应用程序的bussines层中分离,在我看来,这是最干净的方式。

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

我希望我至少有点帮助。

答案 1 :(得分:1)

问题1:如果要初始化某些值(例如在构造函数中),则只需要将新实例传递给View。

问题2:如果您创建Derpina的新实例,则不会获得用户输入的值。您需要将Derpina的实例传递到Derp方法,如方案3中所示。

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