Используя готовые локаторы методов в ASP.NET MVC (3 или 4DP), существует ли способ заставить инфраструктуру MVC различать строку и Guid без необходимости разбора параметра в действии контроллера
Примеры использования будут для URL
http://[domain]/customer/details/F325A917-04F4-4562-B104-AF193C41FA78
выполнить
public ActionResult Details(Guid guid)
метод и
http://[domain]/customer/details/bill-gates
выполнить
public ActionResult Details(string id)
способ.
Без изменений, очевидно, что методы неоднозначны, а именно:
public ActionResult Details(Guid id)
{
var model = Context.GetData(id);
return View(model);
}
public ActionResult Details(string id)
{
var model = Context.GetData(id);
return View(model);
}
, что приводит к ошибке:
The current request for action 'Details' on controller type 'DataController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Details(System.Guid) on type Example.Web.Controllers.DataController
System.Web.Mvc.ActionResult Details(System.String) on type Example.Web.Controllers.DataController
Я попытался использовать пользовательское ограничение (на основе Как я могу создать ограничение маршрута типа System.Guid? ), чтобы попытаться протолкнуть его через маршрутизацию:
routes.MapRoute(
"Guid",
"{controller}/{action}/{guid}",
new { controller = "Home", action = "Index" },
new { guid = new GuidConstraint() }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
И переключил подписи действий на:
public ActionResult Details(Guid guid)
{
var model = Context.GetData(guid);
return View(model);
}
public ActionResult Details(string id)
{
var model = Context.GetData(id);
return View(model);
}
Ограничение выполняется и проходит, таким образом, аргумент отправляется действию, но, по-видимому, все еще в виде строки, и, следовательно, неоднозначно для двух сигнатур методов. Я ожидаю, что в методах действия есть что-то, что вызывает неоднозначность и, следовательно, может быть переопределено путем подключения пользовательского модуля для поиска методов.
Тот же результат может быть достигнут при разборе строкового параметра, но для краткости было бы неплохо избежать этой логики в действии (не говоря уже о том, чтобы, надеюсь, использовать его когда-нибудь позже).