123

この行で:

@Html.ActionLink("Reply", "BlogReplyCommentAdd", "Blog",
         new { blogPostId = blogPostId, replyblogPostmodel = Model,
         captchaValid = Model.AddNewComment.DisplayCaptcha })

blogPostIdで次のランタイムエラーが発生します。

パラメータディクショナリには、メソッド'System.Web.Mvc.ActionResult BlogReplyCommentAdd(Int32、Nop.Web.Models.Blogs.BlogPostModel、Boolean)'のnull許容型ではないタイプ'System.Int32'のパラメータ'blogPostId'のnullエントリが含まれています。 'Nop.Web.Controllers.BlogController'。オプションパラメータは、参照型またはnull許容型であるか、オプションパラメータとして宣言されている必要があります。パラメータ名:パラメータ

私はすでにこれに次のような値を割り当てています

    @{         
        var blogPostId = Model.Id;          
     }

私のコントローラー:

 public ActionResult BlogReplyCommentAdd(int blogPostId, BlogPostModel model, bool captchaValid)
    {}

私は何か間違ったことをしていますか?例を挙げてください。

4

4 に答える 4

283

Html.ActionLinkヘルパーの間違ったオーバーロードを使用しています。あなたが思っていることrouteValuesは、実際にはhtmlAttributes! 生成された HTML を見るだけで、このアンカーの href プロパティが期待どおりに見えないことがわかります。

使用しているものは次のとおりです。

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // routeValues
    new {                                                     // htmlAttributes
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    }
)

そして、これがあなたが使うべきものです:

@Html.ActionLink(
    "Reply",                                                  // linkText
    "BlogReplyCommentAdd",                                    // actionName
    "Blog",                                                   // controllerName
    new {                                                     // routeValues
        blogPostId = blogPostId, 
        replyblogPostmodel = Model, 
        captchaValid = Model.AddNewComment.DisplayCaptcha 
    },
    null                                                      // htmlAttributes
)

また、コードには別の非常に深刻な問題があります。次のルート値:

replyblogPostmodel = Model

このような複雑なオブジェクトを ActionLink で渡すことはおそらくできません。したがって、それを取り除き、BlogPostModelコントローラーアクションからパラメーターも削除します。パラメータを使用して、blogPostIdこのモデルが永続化されている場所からモデルを取得するか、必要に応じて GET アクションでモデルを取得した場所からモデルを取得する必要があります。

public ActionResult BlogReplyCommentAdd(int blogPostId, bool captchaValid)
{
    BlogPostModel model = repository.Get(blogPostId);
    ...
}

最初の問題が間違ったオーバーロードに関係している限り、名前付きパラメーターを使用してヘルパーを作成することをお勧めします。

@Html.ActionLink(
    linkText: "Reply",
    actionName: "BlogReplyCommentAdd",
    controllerName: "Blog",
    routeValues: new {
        blogPostId = blogPostId, 
        captchaValid = Model.AddNewComment.DisplayCaptcha
    },
    htmlAttributes: null
)

コードが読みやすくなっただけでなく、Microsoft がこれらのヘルパー用に作成した無数のオーバーロードの間で混乱することはありません。

于 2013-01-04T07:18:07.690 に答える
12

次のような 2 つのパラメーターを渡す必要があります。

/コントローラー/アクション/Param1Value/Param2Value

こちらです:

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= Param1Value, 
        Param2Name = Param2Value 
    },
    htmlAttributes: null
)

このURLを生成します

/Controller/Action/Param1Value?Param2Name=Param2Value

パラメータ 2 をパラメータ 1 にマージすることで回避策を使用したところ、必要なものが得られました。

@Html.ActionLink(
    linkText,
    actionName,
    controllerName,
    routeValues: new {
        Param1Name= "Param1Value / Param2Value" ,      
    },
    htmlAttributes: null
)

そして私は得る:

/コントローラー/アクション/Param1Value/Param2Value

于 2016-08-24T12:03:40.120 に答える
6

以下を使用して値を渡すことができます。

@Html.ActionLink("About", "About", "Home",new { name = ViewBag.Name }, htmlAttributes:null )

コントローラ:

public ActionResult About(string name)
        {
            ViewBag.Message = "Your application description page.";
            ViewBag.NameTransfer = name;
            return View();
        }

URLは次のようになります

http://localhost:50297/Home/About?name=My%20Name%20is%20Vijay
于 2019-05-19T06:03:16.983 に答える
0

問題は、null である値 Model.Id にある必要があります。値を割り当てることで確認できます。

@{         
     var blogPostId = 1;          
 }

エラーが消えた場合は、ビューに渡す前にモデル ID に値があることを確認する必要があります

于 2013-01-04T07:11:34.743 に答える