asp.net mvc路由id参数

时间:2010-04-30 08:30:55

标签: asp.net asp.net-mvc routing

我正在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 有用。

此方法必须具有相同的参数名称吗?或者我是否需要为这种情况创建单独的路线?

6 个答案:

答案 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中的值。这显然是绑定问题。

如何解决:

  1. 为模型绑定器创建一个类:

    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;
        }
    }
    
  2. 为自定义模型绑定创建自定义属性:

    [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);
        }
    }
    
  3. 根据需要将新属性应用于您的操作参数:

    public ActionResult ErrorPage(
    [BindParameter("id")]
    int errorno)
    {
        return View();
    }
    
  4. 现在,您的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();
    }