0

少し悪夢を見て、うまくいけば、私はただ愚かです。

次のコントローラー アクションがあります。

<HttpGet()>
Function News() As ActionResult
End Function

<HttpGet()>
Function News(ByVal id As Integer) As ActionResult
End Function

URLにIDがない場合は最初に、ある場合は2番目に行きます。

次のエラーが発生しました。

コントローラ タイプ 'MarketsController' のアクション 'News' に対する現在のリクエストは、次のアクション メソッド間であいまいです: タイプ TradeChaseMVC.MarketsController の System.Web.Mvc.ActionResult News() System.Web.Mvc.ActionResult News(Int32)タイプ TradeChaseMVC.MarketsController

したがって、次のように、オプションの id パラメータを使用せずにルートを明示的に作成した場合、次のように考えました。

    routes.MapRoute( _
        "Default2", _
        "{controller}/{action}/{id}",
        New With {.controller = "Home", .action = "Index"},
        New With {.action = "^[a-zA-Z_]+$", .id = "\d{1,8}|"}
    )

    routes.MapRoute( _
        "Default", _
        "{controller}/{action}",
        New With {.controller = "Home", .action = "Index"},
        New With {.action = "^[a-zA-Z_]+$"}
    ) 

動作しますが、同じエラーではありません。

これで、簡単な解決策はメソッドを別のものと呼ぶことだとわかりましたが、これはしたくありません。

また、ID メソッドのプレフィックスとして属性を作成し、そこに ID があることを確認し、そうでない場合はそのメソッドを許可しないことも考えていましたが、これも機能しません。

どんな助けでも大歓迎です。カール

4

2 に答える 2

2

UrlParameter.Optional および null 許容 ID を使用してこれを解決できます。

routes.MapRoute( _
    "Default2", _
    "{controller}/{action}/{id}",
    New With {.controller = "Home", .action = "Index", id = UrlParameter.Optional},
    New With {.action = "^[a-zA-Z_]+$", .id = "\d{1,8}|"}
)

Function News(ByVal id As Integer?) As ActionResult
    if id.HasValue then 
         ...
    else
        ...
    end if 
End Function
于 2011-06-21T12:42:29.033 に答える
1

いいえ、呼び出されるアクションの名前を特定すると、MVC アクション呼び出し元はリクエストを分析してどのパラメーターバインドされているかを確認しないため、2 つのメソッドのどちらかを選択できません。

パラメータ バインディング ステージは、メソッドが選択されるまで発生しません。したがって、それらに異なる名前を付ける必要があります-または、idパラメーターをnull許容整数にし(オプションのidルートパラメーターをデフォルトのままにして)、nullになった場合は他のオーバーロードにチェーンするだけです。

これを行う場合は、非パラメータ オーバーロードを でデコレートしてNonActionAttribute、アクションの呼び出し側が混乱しないようにするか、実際には非公開/保護にします。

アップデート

私たちのコメントに続く更新 - アクション メソッドの名前を変更する場合、REST 標準に戻る必要はありません - ルートをより具体的にするだけです (事前にお詫び申し上げます - VB.Net は私の第二言語ではありません!):

<HttpGet()>
<ActionName("AllNews")>
Function News() As ActionResult 
End Function

<HttpGet()>
Function News(ByVal id As Integer) As ActionResult
End Function  

'-- route for single news item with constraint
routes.MapRoute(
  "News",
  "Markets/News/{id}",
  New With { .controller = "Markets", .action = "News" }, 
  New With { .id = "\d{1,8}" });

'-- route for the all news action method
routes.MapRoute(
  "AllNews",
  "Markets/News",
  New With { .controller = "Markets", .action = "AllNews" });

ここで、2 つのアクション メソッドを対象とするが、同じ RESTful URI スキームの下にある明示的なルートを作成する必要があります。

私のすべての MVC REST サービスは、解決しようとしているのとまったく同じ理由で、このようなより多くの明示的なルートを使用する傾向があります。

于 2011-06-21T12:18:01.143 に答える