同じアクション名を使用して呼び出される 2 つのアクション メソッドがありますが、実際のパラメーターの型に応じて、どちらのメソッドを呼び出すかが異なります。これはあいまいさを引き起こします。パラメータが Guid であり、適切なメソッドであるかどうかを判断する属性を作成しました。
[RequiredGuidParameter(ParameterName = "title")]
[ActionName("Title")]
public ActionResult Item_ById(Guid id)
{ ... }
[ActionName("Title")]
public ActionResult Item_ByName(string id)
{ ... }
属性は次のようになります。
public string ParameterName = string.Empty;
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
object parameter = null;
try
{
parameter = controllerContext.RouteData.GetRequiredString(ParameterName) as object;
if (parameter != null)
{
Guid guid;
return Guid.TryParse((string)parameter, out guid);
}
}
catch { }
parameter = controllerContext.RequestContext.HttpContext.Request[ParameterName] as object;
if (parameter != null)
{
Guid guid;
return Guid.TryParse((string)parameter, out guid);
}
return false;
}
最終的な目標は、パラメーターが Guid の場合はこのメソッドを実行し、それ以外の場合は先に進み、次のメソッドを見つけることです。追加のルートの作成を伴わないより良い方法はありますか? それとも、もっと良い方法ですか?