[razor] @ Html.ActionLink MVC 4에서 컨트롤러로 매개 변수 전달

이 줄에서 :

@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)’메서드에 대해 nullable 형식이 아닌 ‘System.Int32’매개 변수 ‘blogPostId’에 대한 null 항목이 있습니다. ‘Nop.Web.Controllers.BlogController’입니다. 선택적 매개 변수는 참조 유형이거나 널 입력 가능 유형이거나 선택적 매개 변수로 선언되어야합니다. 매개 변수 이름 : 매개 변수

나는 이미 이것에 대해 다음과 같은 값을 할당했습니다.

    @{
        var blogPostId = Model.Id;
     }

내 컨트롤러 :

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

내가 뭘 잘못하고 있니? 예를 들어주세요.



답변

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
)

또한 코드에 또 다른 심각한 문제가 있습니다. 다음 routeValue :

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가 이러한 도우미를 위해 만든 수많은 오버로드간에 혼동이 발생하지 않습니다.


답변

다음과 같은 두 개의 매개 변수를 전달해야합니다.

/ Controller / Action / Param1Value / Param2Value

이 방법:

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

이 URL을 생성합니다

/ Controller / Action / Param1Value? Param2Name = Param2Value

매개 변수 1에서 매개 변수 2를 병합하여 해결 방법을 사용했고 원하는 것을 얻었습니다.

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

그리고 나는 얻는다 :

/ Controller / Action / Param1Value / Param2Value


답변

아래를 사용하여 값을 전달할 수 있습니다.

@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


답변

문제는 null 인 Model.Id 값에 있어야합니다. 예를 들어 값을 할당하여 확인할 수 있습니다.

@{
     var blogPostId = 1;
 }

오류가 사라지면 뷰에 전달하기 전에 모델 ID에 값이 있는지 확인해야합니다.


답변