asp.net mvc routing id参数
我正在asp.net mvc的网站上工作。我有路线asp.net mvc routing id参数
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
// Parameter defaults
);
这是默认路线。我有一个方法
public ActionResult ErrorPage(int errorno)
{
return View();
}
现在,如果我要运行与http://something/mycontroller/Errorpage/1 这个代码不工作。但是,如果我将参数名称从errorno
更改为ID,它就可以工作。
该方法是否必须具有相同的参数名称?还是我需要为这种情况创建单独的路线?
所以,你有一个名为errorno
参数,你希望它有从参数id
值。这显然是具有约束力的问题。
如何解决它:
-
创建模型绑定类:
public class ParameterBinder : IModelBinder { public string ActualParameter { get; private set; } public ParameterBinder(string actualParameter) { this.ActualParameter = actualParameter; } public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { object id = controllerContext.RouteData.Values[this.ActualParameter]; return id; } }
-
创建自定义模型的自定义属性绑定:
[AttributeUsage(AttributeTargets.Parameter)] public class BindParameterAttribute : CustomModelBinderAttribute { public string ActualParameter { get; private set; } public BindParameterAttribute(string actualParameter) { this.ActualParameter = actualParameter; } public override IModelBinder GetBinder() { return new ParameterBinder(this.ActualParameter); } }
-
应用根据需要为您的动作参数添加新属性:
public ActionResult ErrorPage( [BindParameter("id")] int errorno) { return View(); }
现在你errorno
将有值,这是因为id
过去了您的网址。
注意:您可以从上面的示例中删除参数id
,如果您确定需要它,只能解决id
。
离开这种方式可以让你绑定其他参数。
您可以重命名默认根目录中的参数(这可能不是一个好主意),也可以在操作方法中重命名它。添加另一个根将无济于事,因为它将与缺省值相同,并给出路由引擎无法区分这两者的url,并且将始终占用列表中的第一个。
尝试在动作方法中使用与路由表url参数中相同的参数名称。
global.asx
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
myController的
public ActionResult ErrorPage(int id)
{
return View();
}
我知道是这样工作的。但我不想要它。 – Parminder 2010-04-30 13:52:56
选项1
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
public ActionResult ErrorPage(int id)
{
return View();
}
选项2
routes.MapRoute(
"Default",
"{controller}/{action}/{errorno}",
new { controller = "Home", action = "Index", errorno = UrlParameter.Optional }
);
public ActionResult ErrorPage(int errorno)
{
return View();
}
选项3
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
public ActionResult ErrorPage(int id)
{
int errorno = id;
return View();
}
@Parminder 默认路由可以使用一个参数“id”处理所有操作。我认为并不是每一个行动都需要这个参数。所以,我改变我的默认路由
routes.MapRoute(
"Default",
"{controller}/{action}",
new { controller = "Home", action = "Index"}
);
,您可以添加新的路由:
routes.MapRoute("errorpage", "yourcontroller/errorpage/{errorno}",
new {controller="controllername", action="errorpage"});
这只是处理您控制研究的名字是“controllername”。如果你想处理所有的控制器,可以补充一点:
routes.MapRoute("errorpage", "{controller}/errorpage/{errorno}",
new {controller="controllername", action="errorpage"});
这种方法,如果你需要大量的自定义路由将创造在Global.asax中非常代码。
使用绑定属性前缀:
public ActionResult Customer([Bind(Prefix = "id")]string cname) {}
重复:http://stackoverflow.com/questions/2030614/asp-net-mvc-action-parameter-naming – 2010-12-10 11:54:41