我正在.NET 4
框架上的ASP.NET
MVC
C#
中开发一个应用程序。
我在routing
中感到困惑,我做了研究并开发了一个演示版本。它按我的意愿工作,但我想知道哪种方法是开发应用程序的最佳实践。
首先我注册这样的路线:
routes.MapRoute(
name: "RoutesTesting",
url: "{controller}/{action}/{a}/{b}/{c}/{d}/{e}",
defaults: new { controller = "Home", action = "Test", e = UrlParameter.Optional }
);
我有一个具有属性的类,它的名称与路由的参数相同。
class MyClass{
public string a{get;set;}
public string b{get;set;}
public string c{get;set;}
public string d{get;set;}
public string e{get;set;}
}
现在我创建了两个方法,可以成功地从URL中查找和获取数据。
方法1:
public ActionResult Test(MyClass objMyClass){
}
方法2:
public ActionResult Test(string a,string b,string c,string d,string e=String.Empty){
}
我的问题是:
路由在我的行动方法中进行对话吗?就像它转换"MyClass"对象属性中的参数值一样?
使用哪种方法是最佳实践?
当对话不可能时,方法1是否会引发任何错误或异常?
提前感谢。。。
您看到的行为是ASP.NET模型绑定的一部分。它的神奇之处在于,您可以跨{"firstName":"Jonathon","lastName":"Chase"}
的JSON对象进行发送,并且必须自动映射到一个看起来像这样的模型Person:
public class Person {
public string FirstName {get;set;}
public string LastName {get;set;}
}
事实上,你可以创建一条这样的路线,这只是一个结果。模型绑定是一个复杂的主题,但我可以谈谈你如何形成路线的一些方面,特别是如果你创建的操作会产生副作用,比如写入数据库。
通常,如果您要使用一个将影响状态的方法,则应该使用除Get之外的Http谓词,并在请求的正文中而不是在查询/url字符串中发送模型。模型绑定将以任何一种方式为您处理映射。
您应该更喜欢使用强模型而不是多个基元作为参数,尤其是在信息将通过查询字符串在请求体中发送的情况下。
然而,这些观点是有争议的,在大多数情况下不应该被视为硬性规则。
至于你的最后一点,如果参数不正确,以至于Route无法识别动作或控制器,你应该得到404。但是,如果您有一个不可为null的valuetype作为未正确发送的预期路由属性,那么您应该期望一个带有InvalidOperationException的500。
看看模型绑定是如何工作的
路由在我的行动方法中进行对话吗?喜欢它是否转换"MyClass"对象属性中的参数值?
框架模型绑定器正在根据动作参数进行转换。
使用哪种方法是最佳实践?
这是一个固执己见的问题。取决于哪一个适合你的需要。该框架同时处理这两个问题。
Is方法1将在会话为不可能?
模型绑定器将为不匹配的属性的操作参数传递null。