我正在asp.net mvc的网站上工作。我有路线
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
有用。
此方法必须具有相同的参数名称吗?或者我是否需要为这种情况创建单独的路线?
答案 0 :(得分:16)
选项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();
}
答案 1 :(得分:16)
因此,您有一个名为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
。
离开这种方式也可以绑定其他参数。
答案 2 :(得分:6)
使用绑定属性前缀:
public ActionResult Customer([Bind(Prefix = "id")]string cname) {}
答案 3 :(得分:1)
@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中创建非常多的代码。
答案 4 :(得分:0)
您可以在默认根目录中重命名该参数(这可能不是一个好主意),也可以在操作方法中重命名该参数。添加另一个根将无济于事,因为它将与默认根相同,并且给定一个URL,路由引擎无法区分这两个根,并且将始终采用列表中的第一个。
答案 5 :(得分:0)
尝试在action table url参数中使用与action方法相同的参数名称。
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();
}