C# MVC - 路由问题/混乱
C# MVC - Routing Issue / Confusion
我正在 .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 具有属性,它的名称与路由参数相同。
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 中查找和获取数据。
方法一:
public ActionResult Test(MyClass objMyClass){
}
方法二:
public ActionResult Test(string a,string b,string c,string d,string e=String.Empty){
}
我的问题是:
路由是否在我的操作方法中进行该对话?喜欢它转换“MyClass”对象属性中的参数值吗?
哪种方法最适合使用?
当无法进行对话时,方法 1 是否会抛出任何错误或异常?
提前致谢...
Is routing doing that conversation in my action method? Like it
convert the parameter values in the `MyClass' object's properties?
框架模型绑定器正在根据操作参数进行转换。
Which method is best practice to use?
这是一个自以为是的问题。取决于哪一个适合您的需求。该框架处理两者。
Is method 1 will throw any error or exception when the conversation is
not possible ?
模型绑定器会将 null 传递给不匹配属性的操作参数。
您看到的行为是 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。但是,如果你有一个不能像预期的那样为空的值类型routed 属性 未正确发送,您应该期待一个带有 InvalidOperationException 的 500。
我正在 .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 具有属性,它的名称与路由参数相同。
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 中查找和获取数据。
方法一:
public ActionResult Test(MyClass objMyClass){
}
方法二:
public ActionResult Test(string a,string b,string c,string d,string e=String.Empty){
}
我的问题是:
路由是否在我的操作方法中进行该对话?喜欢它转换“MyClass”对象属性中的参数值吗?
哪种方法最适合使用?
当无法进行对话时,方法 1 是否会抛出任何错误或异常?
提前致谢...
Is routing doing that conversation in my action method? Like it convert the parameter values in the `MyClass' object's properties?
框架模型绑定器正在根据操作参数进行转换。
Which method is best practice to use?
这是一个自以为是的问题。取决于哪一个适合您的需求。该框架处理两者。
Is method 1 will throw any error or exception when the conversation is not possible ?
模型绑定器会将 null 传递给不匹配属性的操作参数。
您看到的行为是 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。但是,如果你有一个不能像预期的那样为空的值类型routed 属性 未正确发送,您应该期待一个带有 InvalidOperationException 的 500。