Параметр asp.net mvc routing id

Я работаю над сайтом в 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 он не работает. Но если я изменю имя параметра на id из errorno оно работает.

Обязательно ли иметь такое же имя параметра для этого метода? Или мне нужно создать отдельные маршруты для таких ситуаций?

Ответы

Ответ 1

Итак, у вас есть параметр с именем 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 для вашего URL.

Примечание: вы можете удалить параметр id из приведенного выше примера, если вы уверены, что его нужно решить только для id.

Оставляя этот способ, вы также можете привязать другие параметры.

Ответ 2

Вариант 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();
}

Ответ 3

используйте префикс атрибута привязки:

public ActionResult Customer([Bind(Prefix = "id")]string cname) {}

Ответ 4

@Parminder Маршрут по умолчанию может обрабатывать все действия с помощью одного параметра "id". И я думаю, что не каждому действию нужен этот параметр. Поэтому я меняю маршрут по умолчанию

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

и вы можете добавить новый маршрут:

routes.MapRoute("errorpage", "yourcontroller/errorpage/{errorno}",
    new {controller="controllername", action="errorpage"});

это просто управление вашим именем controll является "controllername". Если вы хотите обрабатывать весь контроллер, вы можете добавить это:

routes.MapRoute("errorpage", "{controller}/errorpage/{errorno}",
    new {controller="controllername", action="errorpage"});

Этот метод создаст очень много кода в global.asax, если вам нужно много настраиваемого маршрута.

Ответ 5

Вы можете либо переименовать параметр в корне по умолчанию (что, вероятно, не очень хорошая идея), либо переименовать его в методе действий. Добавление другого корня не поможет, потому что оно будет таким же, как и по умолчанию, и с учетом URL-адреса механизм маршрутизации не может различать два и всегда будет первым в списке.

Ответ 6

попытайтесь использовать одно и то же имя параметра в методе действия, как в параметре 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();
    }