0
同じアクション名を使用して呼び出される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は、この方法を実行するということで究極の目標は、それ以外の場合は、次のものを見つけた場合には、上に移動します。余分なルートを作成するより良い方法はありますか?それとももっと良い方法でしょうか?
\ /擬似コードをwarranty'd。このアクションメソッドを指すリンクは、タイトル(文字列)またはID(GUID)です。文字列がGuidであるかどうかをチェックしてif/then文を実行することができましたが、その前に懸念事項を分離することを望んでいました。 –
@トニーBasallo - これらのルートパラメータをオプションにすることができますか?Id = asdまたは?guid = longguidstringは常に働きました。 – jfar
これはオプションですので、答えと呼んでいます。 –