3

/Blog と /Blog/1 の両方にアクセスしたいのですが、「1」はブログの ID です。これが私のコードです:

    '
    ' GET: /Blog/

    Function Index() As ViewResult
        Return (View(db.Blogs.ToList()))
    End Function

    '
    ' GET: /Blog/(Integer)

    Function Index(id As Integer) As ViewResult
        Dim blog As Blog = db.Blogs.Find(id)
        Return View("Details", "_MyLayout", blog)
    End Function

エラーが発生します:

「/」アプリケーションでサーバー エラーが発生しました。

コントローラー タイプ 'BlogController' のアクション 'Index' に対する現在の要求は、次のアクション メソッド間であいまいです: タイプ GemcoBlog.GemcoBlog.BlogController の System.Web.Mvc.ViewResult Index() System.Web.Mvc.ViewResult Index(Int32)タイプ GemcoBlog.GemcoBlog.BlogController

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.Reflection.AmbiguousMatchException: コントローラー タイプ 'BlogController' のアクション 'Index' に対する現在の要求は、次のアクション メソッド間であいまいです: タイプ GemcoBlog.GemcoBlog.BlogController システムの System.Web.Mvc.ViewResult Index()。タイプ GemcoBlog.GemcoBlog.BlogController の Web.Mvc.ViewResult インデックス (Int32)

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

Index() メソッドをオーバーロードするにはどうすればよいですか?

編集:

私はまた、それらを次のように組み合わせようとしています:

    '
    ' GET: /Blog/

    Function Index(id As Integer) As ViewResult
        If (id) Then
            Dim blog As Blog = db.Blogs.Find(id)
            'Return View(blog)
            Return View("Details", "_MyLayout", blog)
        Else
            Return (View(db.Blogs.ToList()))
        End If
        'Return View(db.Blogs.Where(Function(x) x.Name = "Test").ToList())
    End Function

ただし、エラーは次のとおりです。

「/」アプリケーションでサーバー エラーが発生しました。

パラメーター ディクショナリには、'Blog.Blog.BlogController' のメソッド 'System.Web.Mvc.ViewResult Index(Int32)' の null 非許容型 'System.Int32' のパラメーター 'id' の null エントリが含まれています。オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。パラメータ名: パラメータ

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.ArgumentException: パラメーター ディクショナリには、'Blog.Blog.ブログコントローラー」。オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。パラメータ名: パラメータ

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

4

4 に答える 4

2

同じ HTTP 動詞でアクセス可能な同じコントローラーで 2 つのアクションを持つことはできません。したがって、アクション名を変更するか、別の HTTP 動詞を使用してあいまいさを解消する必要があります。例えば:

<HttpPost>
Function Index(id As Integer) As ViewResult
    Dim blog As Blog = db.Blogs.Find(id)
    Return View("Details", "_MyLayout", blog)
End Function

しかし、他のアクションもデータをフェッチしているように見えるので、POST アクセスのみにしたくないと思います。したがって、この場合は単に名前を変更してください。IndexリソースのリストShowを返し、特定のリソースを返すために使用できる標準の RESTful 規則に固執します。

Function Index() As ViewResult
    Return (View(db.Blogs.ToList()))
End Function

'
' GET: /Blog/(Integer)

Function Show(id As Integer) As ViewResult
    Dim blog As Blog = db.Blogs.Find(id)
    Return View("Details", "_MyLayout", blog)
End Function
于 2012-07-26T16:20:17.750 に答える
2

これを行うにはいくつかの方法があります。最も簡単な方法は、最初のメソッドの名前を「ShowBlog」または任意の名前に変更し、global.asax でパラメーターなしで /Blog ルートにルーティングするルートをセットアップすることです。

例 (c#):

routes.MapRoute("Blog", "Blog", new { controller = "Blog", action = "ShowBlog" });

MapRoute がデフォルト ルートの前にあることを確認します。

2 番目のメソッドを機能させるには、id を null 可能にしてから、メソッドで null をチェックする必要があります。

于 2012-07-26T16:59:39.707 に答える
1

nullable ではないため、デフォルトで ID を提供していると自動的に想定されます。Id を Nullable Integer にすると、両方の URL で機能します。

Function Index(id As Nullabe( Of Integer )) As ViewResult

于 2012-07-26T16:58:52.753 に答える
0

Erik の投稿を機能させるための小さな修正 (私は MVC4 を使用しています)

routes.MapRoute("Blog", "Blog/{id}", new { controller = "Blog", action = "ShowBlog" });
于 2014-08-20T02:14:01.323 に答える