繁体   English   中英

MVC ActionResult方法,参数如何匹配?

[英]MVC ActionResult Methods, how are parameters matched?

我会尽力尽力说出来。 让我们假设我在控制器X中有一个方法:

Index(string someString)

这有效吗? :X /索引

或者我需要:X / Index / someString

(所有这些都使用默认路由配置)。

现在,是否可以使用第二种方法,以便:

Index(stringSomestring)
{
..
}

Index()
{
}

如果是这样,MVC路线如何选择正确的方法?

最后...

有什么区别:在routeConfiguration或方法Parameters本身中声明参数默认值?

例如:

rotes.Add("", "etcetc", new {someString = string.Empty);

VS

Index(string someString = string.Empty)

如果它太愚蠢或冗长,谢谢和抱歉。

----编辑-----感谢您对anaximander的回应,你帮我清醒了一下(虽然还在挣扎)。 考虑一下:

routes.MapRoute("",
                "Student/Sort-By{sortType}",
                new { controller="Student", action="Index", sortType= ""}
                );

我有一个方法:

Index(string sortType)
{
...
}

如果我提供了一个网址:学生/排序日期,它可以正常工作。 如果我提供了一个url:Student / Sort-By它什么也没找到,虽然我的方法有一个空排序选项...

我觉得我过于复杂/做一些愚蠢的事情,但无法确定什么:(

这取决于您的路由设置。 默认路由如下所示:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

请注意UrlParameter.Optional部分。 这意味着你可以去somehost.com/X/Index ,它会寻找一个方法Index() ,或者你可以添加另一个斜杠和一个参数,它会寻找Index(foo id) ,其中foo是任何类型你喜欢。

路径按您添加的顺序应用。 这意味着如果你从RouteConfig的顶部开始RouteConfig读,那么第一个与URL匹配的就是它将使用的那个。 这就是为什么你应该将更多特定路由放在更一般的路由之上 - 否则,一般路由将捕获所有URL并停止使用更具体的路由。

该系统寻找:

  • 与URL的{controller}部分匹配的{controller} (如果URL未指定,则为默认控制器)
  • 该控制器上与URL的{action}部分匹配的所有操作方法(如果URL未指定,则为默认操作)
  • 任何具有与从URL提取的参数集匹配的参数名称的方法,以及路径中指定的那些方法。
    • 这意味着对于方法Index(int id) ,如果URL包含{id}部分,它将使用该方法。 如果该部分不存在,但路由指定了默认值,那么它将使用该方法的默认值。 如果没有值,没有默认值,并且参数被标记为UrlParameter.Optional ,它将查找不需要id另一个方法。 (如果参数是必需的,则此路由不匹配,因为URL未提供。)
    • 如果系统无法确定您尝试调用哪种方法,则会收到一个异常,告诉您路由不明确。

因此,在您的情况下,如果您希望能够使用somehost.com/X/Index来获取Index(string someString)那么您将需要这样的路由:

routes.MapRoute(
    name: "Index",
    url: "{controller}/{action}/{someString}",
    defaults: new { controller = "X", action = "Index", someString = String.Empty }
);

如果URL没有给出一个,那么将使用空字符串调用Index(string someString) 如果您希望没有someString参数的URL转到Index ,那么您可以设置somestring = UrlParameter.Optional ,如果URL没有提供,则会查找不需要它的方法。 如果你将someString完全保留在默认值之外,那么任何没有提供的URL都将对此路由无效,并且必须匹配其他路由。 如果你仍然在底部有预先提供的默认路由,那么它将捕获somehost.com/X/Index因为它适合该模板,所以它假设你已经省略了可选的id参数并寻找一个像Index()这样的方法。

编辑:

当组合URL fluff和这样的参数时,它会变得有点棘手。 我无法自己运行调试,我猜想就系统而言,当匹配Sort-By{sortType} ,字符串Sort-By不是"Sort-By" + "" ,它是"Sort-By" + null 也就是说,URL不会将{sortType}的值赋予空字符串,因为空字符串仍然是一个字符串 ,而此URL在该位置根本不包含任何字符串 如果URL未提供{sortType}的值且未标记为可选,则URL与此路由不匹配。 这可能会更好:

routes.MapRoute("",
    "Student/Sort/{sortType}",
    new { controller="Student", action="Index", sortType= ""}
);

或者,您可以考虑从URL中删除排序并使用查询参数,以便路由成为

routes.MapRoute("",
    "Student/",
    new { controller="Student", action="Index", sortBy= ""}
);

并排序你去host.com/Student/?sortBy=Date

您的路由不能有多个Index()

如果要使用X / Index或X / Index / someText

你必须声明ActionResult索引(字符串someString)

路由过程将知道Index可以接受String,然后它将重定向到正确的操作。 您不需要将字符串呈现为可空或指定空字符串。 字符串将只是null。

为了“猜测”正确的行为,我认为mvc框架使用反射并关联参数的类型和名称。

路由过程将始终有效,但如果要指定与默认方式不同的路由,则必须:

rotes.Add("", "etcetc", new {someString = string.Empty);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM