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


109

이 줄에서 :

@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)
    {}

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

답변:


257

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


당신은 변화의 의견을 필요로 controllerName하고actionName
webdeveloper

@DarinDimitrov : 모델을 매개 변수로 전달하는 방법?
NetraSW

1
@ DarinDimitrov, @ webdeveloper : actionresult에 [httppost]를 언급해야합니까?
NetraSW

@NetraSW, [HttpPost]링크가 GET 요청을 보내고 있기 때문에 작업에 가 없어야합니다 . [HttpPost]컨트롤러 작업은 POST 요청으로 만 액세스 할 수 있음을 의미합니다.
Darin Dimitrov 2013 년

@DarinDimitrov :이 일을 어떻게 할 수 있습니까? 모델이 속성 값을 비워 보냅니다. 나를 안내 해주세요.
NetraSW

12

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

/ 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


분명히 이것은 Param1Value가 null 일 때 발생합니다. 방금 같은 문제가 발생했습니다.
AFract 19.01.09

3

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

@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

0

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

@{         
     var blogPostId = 1;          
 }

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


1
아니, 그게 문제가 아니야.
Darin Dimitrov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.