Дифференциация Guid и строковых параметров в MVC 3

Используя готовые локаторы методов в 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);
}

Ограничение выполняется и проходит, поэтому аргумент передается действию, но, по-видимому, все еще в виде строки , и поэтому неоднозначно для двух сигнатур методов. Я ожидаю, что в том, как расположены методы действий, есть что-то, что вызывает неоднозначность и, следовательно, может быть отменено путем подключения настраиваемого модуля для поиска методов.

Тот же результат может быть достигнут путем анализа строкового параметра, но было бы неплохо для краткости, чтобы избежать этой логики в действии (не говоря уже о том, чтобы мы надеялись повторно использовать когда-нибудь позже).

7
задан Community 23 May 2017 в 12:09
поделиться