C#MVC-路由问题/混乱



我正在.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){
}

我的问题是:

  1. 路由在我的行动方法中进行对话吗?就像它转换"MyClass"对象属性中的参数值一样?

  2. 使用哪种方法是最佳实践?

  3. 当对话不可能时,方法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。

最新更新