在ASP.NET MVC(3或4DP)中使用开箱即用的方法定位器,是否有一种方法可以使MVC框架区分字符串和Guid,而无需在控制器操作中解析参数?
使用示例将用于URL
http://[domain]/customer/details/F325A917-04F4-4562-B104-AF193C41FA78
来执行
public ActionResult Details(Guid guid)
方法和
执行
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);
}
约束执行并通过,因此参数被发送到操作,但似乎仍然是一个字符串,并且对于两个方法签名来说含义不明确。我希望有一些方法可以解决这种歧义,可能是在如何定位操作方法方面存在问题,因此可以通过插入自定义模块来覆盖它。通过解析字符串参数可以实现相同的结果,但为了简洁起见,避免在操作中使用该逻辑(更不用说希望将来重用)会非常好。