Understanding [HttpPost], [HttpGet] and Complex Actionmethod parameters in MVC
我对MVC的设计模式和框架都非常陌生。我也不是非常精通ASP.NET Forms的基础知识。但是,我确实了解Web开发以及HTTP Post和GET的基础。
现在,我一直在阅读一些MVC教程,尽管我掌握了MVC模式的工作原理以及"路由引擎"的工作原理,但我还是很了解。然后突然我遇到了一个看起来像下面这样的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class HomeController : Controller { public ActionResult Index() { return View(new MyViewModel()); } [HttpPost] public ActionResult Index(MyViewModel model) { return Content("Thanks","text/html"); } } |
我对此有几个疑问:
- 我对路由引擎的理解是,控件是基于URL传递给特定的ActionMethod的,通常URL基本上是Controller / ActionMethod / Id类型,其中对行为的理解是基本类型。在上面的示例中,调用"
public ActionResult Index(MyViewModel model)?"
由于NyViewModel是复杂类型,因此您不能将其作为URL的一部分传递。你怎么称呼它?
- 当第一个方法不需要任何属性时,为什么第二个方法用[HttpPost]装饰?是否有关于何时使用[Http]属性的准则?
我认为我在这个难题中缺少很大的优势,而且两个问题都是相互关联的。但是,需要一些帮助使关系有意义
Why is this second method adorned with
[HttpPost] when the first method does not require any attributes?
方法的默认值为
Are there any guidelines on when to use
[Http] attributes and when not?
理想情况下,属性应位于每个方法上,以避免混淆。随着您对事物的工作方式更加熟悉,您通常会采用快捷方式(与其他所有方式一样),并在知道不必要时将其省略。
Since
MyViewModel is a complex type, you can not pass it as part of URL. How can you call it?
数据将从请求正文中的数据转换为模型。这可以作为JSON对象,也可以作为表单数据。 (有一些技巧可以从URL初始化对象,但是可能有些复杂和高级。)
通常,复杂的对象使用支持它的动词(例如POST和PUT)在HTTP主体中传递。主体内容必须通过模型绑定验证。这基本上意味着,如果它是Content-Type:application / json的POST请求,则必须将其从JSON反序列化为MyViewModel。如果内容是XML,则必须将其反序列化为XML。
常规约定是首先具有所有可以在URL路径,查询和标头中找到的原始类型,然后具有POST(或PUT)正文中的一种复杂类型。我相信可以将复杂的类型放到其他地方,但是如果您是初学者,那么您就可以进入类型转换器和自定义属性了。
Why is this second method adorned with [HttpPost] when the first method does not require any attributes? Are there any guidelines on when to use [Http] attributes and when not?
" [HttpPost]"告诉路由引擎此方法重载仅可通过HTTP POST使用。在这种情况下,尝试使用正文来放置/ home / index会失败,并显示404 Not Found。无参数版本的Index()不需要它,因为它可以与任何HTTP动词一起使用,包括GET,POST和PUT。
最佳实践-请求处理
最佳做法是仅在控制器中使用将通过视图或json提供服务的公共方法。对于控制器中的所有公共方法,最佳做法是将它们标记为
这些
最佳做法-PRG
Post-Redirect-Get是一种设计模式,它实质上规定,无论何时您要发送来自POST请求的响应,都应重定向到get以便发送响应。这样可以防止出现多种情况,包括使用"后退"按钮时不再发布。
重定向通常使用
发布复杂模型
您可以通过多种方式发送复杂的模型。主要区别在于,如果使用的是GET请求,则在URL中,如果使用的是POST请求,则在请求标头中。如果您使用ajax,则差异将变得模糊,因为您几乎总是将其发送到体内。