我正在ASP.NET
框架的MVC
C#
.NET 4
开发一个应用程序。
我在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会在无法进行对话时抛出任何错误或异常吗?
提前致谢...
答案 0 :(得分:1)
路由是否在我的操作方法中执行该对话?喜欢它 转换`MyClass'中的参数值对象的属性?
框架模型绑定器正在基于actions参数进行转换。
哪种方法最好使用?
这是一个自以为是的问题。取决于哪一个适合您的需求。该框架处理两者。
方法1是否会在对话时抛出任何错误或异常 不可能?
模型绑定器会将null传递给不匹配的属性的action参数。
答案 1 :(得分:1)
您看到的行为是ASP.NET模型绑定的一部分。允许您发送{"firstName":"Jonathon","lastName":"Chase"}
的JSON对象并且必须自动映射到看起来像这样的模型Person,这是神奇的:
public class Person {
public string FirstName {get;set;}
public string LastName {get;set;}
}
您可以创建这样的路线这一事实仅仅是这样做的结果。模型绑定是一个复杂的主题,但我可以触及你如何形成路由的某些方面,特别是如果你正在创建的操作会产生副作用,例如写入数据库。
通常,如果您要使用一个会影响状态的方法,则应使用除Get之外的Http动词,并在请求正文中而不是在query / url字符串中发送模型。模型绑定将以任一方式处理您的映射。
您应该更喜欢使用强模型而不是多个基元作为参数,尤其是在通过查询字符串在请求正文中发送信息的情况下。
然而,这些观点值得商榷,不应被视为大部分的硬性或快速规则。
至于你的最后一点,如果参数不够正确,路由无法识别动作或控制器,你应该得到404.但是,如果你有一个不可为空的值类型作为预期的路由属性如果没有正确发送,你应该期望500带有InvalidOperationException。