了解MVC中的[HttpPost],[HttpGet]和Complex Actionmethod参数

Los*_*ost 12 c# asp.net asp.net-mvc asp.net-mvc-4

我对MVC的设计模式以及框架都非常陌生.我也不是非常精通ASP.NET Forms的基础知识.但是,我也了解Web开发和HTTP Post和GET的基础知识.

现在,我已经阅读了一些MVC教程,虽然我很好地掌握了模式的MVC以及"路由引擎"的工作原理.然后突然我遇到了一个看起来像下面的代码:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return Content("Thanks", "text/html");
    }
}
Run Code Online (Sandbox Code Playgroud)

我很少看到它的问题:

  • 我对路由引擎的理解是控件被传递给基于URL 的特定 ActionMethod,而且通常URL基本上是Controller/ActionMethod/Id类型,其中参数to action menthod是Primitive类型.在上面的这个例子中,调用"需要什么样的URL"

公共ActionResult索引(MyViewModel模型)?"

由于NyViewModel是一种复杂类型,因此您无法将其作为URL的一部分传递.你怎么称呼它?

  • 当第一种方法不需要任何属性时,为什么第二种方法用[HttpPost]装饰?是否有关于何时使用[Http]属性的指南,何时没有?

我想我在拼图中错过了一个很大的问题,而且两个问题都是相互关联的.但是,需要一些帮助才能理解这种关系

kri*_*gar 16

[HttpPost]属性告诉路由引擎将该操作方法的任何POST请求发送到另一个方法.这是一种重载.

[HttpPost]当第一种方法不需要任何属性时,为什么第二种方法被装饰?

方法的默认值是[HttpGet].因此,不需要任何属性.

是否有关于何时使用[Http]属性的指南,何时没有?

理想情况下,属性应该放在每个方法上,以避免混淆.随着您越来越熟悉事物的运作方式,您通常会采用快捷方式(与其他所有内容一样),并在您知道不必要时省略它们.

由于MyViewModel是复杂类型,因此您无法将其作为URL的一部分传递.你怎么称呼它?

数据将根据请求正文中的数据转换为模型.这可以作为JSON对象,也可以作为Form数据.(有一些技巧可以从URL初始化对象,但它们可能有点复杂和高级.)

  • 我喜欢这个答案,因为它直接回答了问题并纠正了错误观念,即复杂的对象无法通过URL传递..NET的模型绑定非常强大!这就是为什么@krillgar说,它可能很复杂一个很好的例子(IE奇怪!)http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/ (2认同)