2013-01-04 373 views
76

控制器這一行:傳遞參數從@ Html.ActionLink MVC 4

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

我得到以下運行時錯誤的blogPostId:

參數字典包含參數 無效項非空類型 'System.Int32' 的方法的 'blogPostId' 'System.Web.Mvc.ActionResult BlogReplyCommentAdd(的Int32, Nop.Web.Models.Blogs.BlogPostModel,布爾型)' 在 「Nop.Web.Controllers .BlogController」。可選參數必須是參考類型 ,可爲空類型,或者聲明爲可選參數 。參數名:參數

我已經在上面如

@{   
     var blogPostId = Model.Id;   
    } 

我的控制器此分配一個值:

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

難道我做錯了什麼?請給我一個例子。

回答

191

您使用的是錯誤的載之前的值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參數來檢索從哪裏這種模式是持久化模型,或者如果您從任何地方獲取在我們採取行動的模型喜歡:

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 
) 

現在不僅是你的代碼更易讀,但你永遠不會有重載,微軟爲那些助手做的gazillions之間的混淆。

+0

您需要更改註釋'controllerName'和'actionName' – webdeveloper

+0

@DarinDimitrov:如何將模型作爲參數傳遞? – NetraSW

+0

@ DarinDimitrov,@ webdeveloper:我需要在actionresult上提及[httppost]嗎? – NetraSW

0

問題必須與值爲Model.Id的值爲null。您可以通過指定的值,如確認

@{   
    var blogPostId = 1;   
} 

如果錯誤disappers,然後u需要確保你的模型ID具有它傳遞給視圖

+1

不,這不是問題。 –

9

我必須要通過像兩個參數:

/控制器/動作/ Param1Value/Param2Value

這樣:

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

就會產生此網址

/Controller/Action/Par ?am1Value Param2Name = Param2Value

我在參數一個合併參數的兩個使用的變通辦法,我得到了我想要的東西:

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

我也得到:

/控制器/ Action/Param1Value/Param2Value

+0

這很奇怪。更多的解釋會很酷 –