2014-09-18 134 views
0

我是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对象为空来通过,但事实并非如此。 MVC(莫名其妙)为我创建了一个MyViewModel

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

思路:

  • 创建于MyViewModel属性时设置视图时回发
  • 检查,如果Request.HttpMethod == "GET""POST"
  • 别的东西吗?
+0

自动绑定可能会创建一个MyViewModel但填充值?模型属性可能为null。 – Jasen 2014-09-18 18:14:04

+0

如果您询问表单是否已过帐?将[HttpPost]属性附加到您的方法中,即期望模型的方法。 – Rab 2014-09-18 18:15:04

回答

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

+0

好吧,我没有意识到,如果我有两种方法,我可以在Post one上返回'View()'并且它仍然直接指向'Index'。谢谢! – DLeh 2014-09-18 18:25:42

2

创建两个动作,一个它接受一个模型实例,一种不被调用。

即使您“正在进入同一页面”,您实际上正在执行两种截然不同的操作。第一个动作加载一个初始页面,第二个动作发布一些值以执行操作。两个操作意味着两种方法:

[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动作中更有意义的动作名称。