我是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"
答案 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
动作更有意义的动作名称。