当前位置: 首页 > 编程语言 > C#

理解MVC,分享ComplexActionmethod参数

时间:2023-04-10 20:27:08 C#

理解MVC,以及ComplexActionmethod参数我对MVC设计模式和框架很陌生。我也不太精通ASP.NET窗体的基础知识。但是,我也了解Web开发和HTTPPost和GET的基础知识。现在,我已经阅读了一些MVC教程,尽管我对MVC的模式以及“路由引擎”的工作原理有了很好的了解。然后突然我遇到了一个看起来像这样的代码:publicclassHomeController:Controller{publicActionResultIndex(){returnView(newMyViewModel());}[HttpPost]publicActionResultIndex(MyViewModelmodel){returnContent("Thanks","text/html");我很少看到它的问题:公共ActionResult索引(MyViewModel模型)?“由于NyViewModel是一种复杂类型,您不能将其作为URL的一部分传递。您怎么称呼它?我想我遗漏了一个很大的难题,两者是相互关联的。但是,需要一些帮助来理解这一点关系。[HttpPost]属性告诉路由引擎将该操作方法的任何POST请求发送到另一个方法。这是一种重载。为什么当第一个方法不需要任何属性时第二个方法用[HttpPost]?方法的默认值是[HttpGet]。因此,不需要任何属性。是否有任何指导何时使用[Http]属性,何时不使用?理想情况下,该属性应放在每个方法论中,以避免混淆。随着您对事物的工作方式越来越熟悉,您通常会采取捷径(与其他所有事情一样)并在知道不需要时省略它们。由于MyViewModel是一种复杂类型,因此您无法传递它作为URL的一部分。你怎么称呼它?数据将根据请求文本中的数据转换为模型。这可以是JSON对象,也可以是表单数据。(有一些从URL对象初始化的技巧,但它们可能有点复杂和高级。)通常,复杂对象通过支持它的动词(例如POST和PUT)在HTTP正文中传递。文字内容必须通过模型绑定验证。这基本上意味着如果它是Content-Type:application/json的POST请求,它必须从JSON反序列化为MyViewModel。如果内容是XML,则必须将其反序列化为XML。一般约定是首先在URL路径、查询和标头中查找所有原始类型,然后在POST(或PUT)正文中查找复杂类型。我确信可以将复杂类型放在别处,但随后您将进入类型转换器和自定义属性,如果您是初学者,您可能应该这样做。当第一个方法不需要任何属性时,为什么第二个方法用[HttpPost]修饰?是否有任何关于何时使用[Http]属性以及何时不使用的指南?“[HttpPost]”告诉路由引擎这个方法重载只能通过HTTPPOST获得。在这种情况下,尝试PUT/home/indexwithbody和404NotFound。Index()的无参数版本不需要它,因为它可以使用任何HTTP动词,包括GET、POST和PUT。最佳实践-请求处理最佳实践是仅在将通过视图或使用json维护的控制器中使用公共方法。对于控制器中的所有公共方法,最佳做法是用[HttpGet]或[HttpPost]或我不会介绍的其他类型之一标记它们,因为它们是更多的边缘情况。这些Http属性将方法限制为仅服务于这些特定类型的请求。虽然默认值为[HttpGet],但我发现在所有情况下不标记[HttpGet]有时会在命名冲突时导致意外行为。BestPractice-PRGPost-Redirect-Get是一种设计模式,它基本上说明无论何时您想要从POST请求发送响应,您都应该重定向以发送响应。这可以防止许多情况,包括在使用后退按钮时不再发布。重定向通常采用[HttpPost]ActionResult的形式,使用returnRedirectToAction("MyHttpGetAction");.发布复杂模型您可以通过多种方式发布复杂模型。主要区别在于,如果您使用的是GET请求,则它位于URL中,如果您使用的是POST请求,则它位于请求标头中。如果您使用的是ajax,则差异会变得模糊,因为您几乎总是在体内发送它。以上就是C#学习教程:理解MVC中ComplexActionmethod参数分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: