Параметр 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();
}