MVC检测模型何时为空

时间:2014-09-18 18:09:24

标签: asp.net-mvc

我是MVC的新手,所以我试图找出一些最佳做法。

假设我有一个控制器HomeController方法Index(MyViewModel model)

public ActionResult Index(MyViewModel model)
{
    //if loading the page for the first time, do nothing
    //if the page has been posted data from somewhere, then I want to use
    //  some of the arguments in model to load other data, like say search results
}

当我导航到/Index页面时,我(我自己)希望model对象通过null,但它没有。 MVC(不知何故)为我创建了一个MyViewModel

我的问题是,确定model是自动创建还是通过帖子创建的最佳方式或最一致方式是什么?

思路:

  • MyViewModel上创建一个在视图回发时设置的属性
  • 检查Request.HttpMethod == "GET""POST"
  • 别的什么?

2 个答案:

答案 0 :(得分:4)

您应该对GET和POST请求使用不同的操作。不要试图让一个方法做得太多。

[HttpGet]
public ActionResult Index()
{
    // handle the GET request
}

[HttpPost]
public ActionResult Index(MyViewModel model)
{
    if (ModelState.IsValid)
    {
        // it's a post and the data is valid
    }
}

然后将调用正确的方法,具体取决于它是GET还是POST

答案 1 :(得分:2)

创建两个动作,一个接受模型实例,另一个不接受。

即使您已经去了同一页面,也可以#34;事实上,你正在执行两种截然不同的动作。第一个操作加载初始页面,第二个操作发布一些要执行的值。两个动作意味着两种方法:

[HttpGet]
public ActionResult Index()
{
    // perform any logic, but you probably just want to return the view
    return View();
}

[HttpPost]
public ActionResult Index(MyViewModel model)
{
    // respond to the model in some way
    return View(model);
    // or return something else?  a redirect?  it's up to you
}

请注意,这种方法会破坏您的其他网址。从语义上考虑您在这些行动中所做的事情:

  • 查看索引
  • 发布到索引

第一个是有道理的,但第二个可能没有。通常,当您POST某事物与某种模型或某种行为相关的事情时。 "指数"并没有真正描述一个动作。你是"创造" - 什么?你是"编辑" - 什么?这些听起来像POST动作更有意义的动作名称。