我必须通过我的操作链接传递一个额外的参数来指示它们来自哪里(因为我需要相应地更改页面中的反向链接)。
由于它是控制器名称,我决定将其命名为controller
。
e.g。示例链接可能是:
@Html.ActionLink(item.Name, "Options", "Questionnaire", new {
id = item.QuestionnaireId,
controller = "templates" }, null)
QuestionnaireController
中的接收操作如下:
public ActionResult Options(int id, string controller)
当操作被点击时,我注意到控制器值不是template
,而是当前控制器的名称(即QuestionnaireController
)。
作为实验,我添加了action
参数,例如:
public ActionResult Options(int id, string controller, string action)
行动价值也是当前行动(即Options
)。
我的解决方法就是将我的参数重命名为source
,但是为什么MVC会将名称controller
和action
映射到动作参数?< / strong>我认为这适用于任何/所有路由映射值,但这是什么目的?
答案 0 :(得分:1)
为什么MVC需要将名称控制器和操作映射到操作参数?
我相信它是QueryStringValueProvider或其他一个ValueProviders(也许是RouteDataValueProvider)的一部分。 ASP.Net MVC使用Convention over Configuration,因此框架使用提供的值来填充方法参数。控制器名称,操作名称甚至区域名称都是URL中提供的值。
我认为这适用于任何/所有路由映射值,但这是什么目的?
ValueProvider用于路由数据以确定要使用的匹配路由,它也恰好是提供数据以填充方法参数的同一对象。您遇到的副作用很可能不是他们试图实施的功能。
DefaultModelBinder.GetValue使用ValueProviders定位值并将其绑定到模型(或方法参数)。