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は、この方法を実行するということで究極の目標は、それ以外の場合は、次のものを見つけた場合には、上に移動します。余分なルートを作成するより良い方法はありますか?それとももっと良い方法でしょうか?

答えて

0

なぜない何かのように:

public ActionResult Item_Search(string id, Guid guid) 
{ 
    if(string.IsNullOrWhiteSpace(id) 
     SearchById(); 
    if(guid != new Guid()) 
     SearchByGuid() 
} 

以外は、私は、そのまたはクエリ文字列を予想ルートを持っている必要があるだろう

+0

\ /擬似コードをwarranty'd。このアクションメソッドを指すリンクは、タイトル(文字列)またはID(GUID)です。文字列がGuidであるかどうかをチェックしてif/then文を実行することができましたが、その前に懸念事項を分離することを望んでいました。 –

+0

@トニーBasallo - これらのルートパラメータをオプションにすることができますか?Id = asdまたは?guid = longguidstringは常に働きました。 – jfar

+0

これはオプションですので、答えと呼んでいます。 –

関連する問題