2012-04-16 74 views
0

我正在構建一個有產品的網站,您可以在產品上留下評論。我有說「發表的評論」ActionLink和參數

在我的代碼,它看起來像這樣的產品頁面上的鏈接:

@Html.ActionLink("Leave a Review", "AddReview", "Product", new { id = Model.ProductId }, null) 

當我運行我的應用程序的鏈接工作正常,但是當我提交評論它崩潰並說:

參數字典包含 非可空類型「System.Int32」參數「身份證」的方法 「System.Web.Mvc.ActionResult產品(System.String一個空項,Int32)'in 'MyProject.Controllers.P roductController」。可選參數 必須是引用類型,可爲空類型,或者聲明爲 可選參數。參數名稱:參數

只有在我的ActionLink中有new { id = Model.ProductId }時纔會出現此錯誤。

這可能看起來像ProductId爲空,但這是不可能的。爲了在第一時間加載了產品頁面需要一個產品編號,再加上我使用,使用的是相同的ID顯示有關頁面上的商品評論一的RenderAction:

@{Html.RenderAction("Reviews", "product", new { id = Model.ProductId});} 

所以基本上,爲什麼我收到此錯誤? 它是否與GET和POST AddReview方法有關?我不認爲它應該考慮鏈接將拉動GET,當我提交表單時,它應該是一個POST。我如何將productId放入表單中?

編輯 要回答一些問題:

我的形式如下:

@using (Html.BeginForm("AddReview", "Product")) 
{ 
    <p>Title @Html.TextBoxFor(x => x.Title)</p> 
    <p>Rating: @Html.TextBoxFor(x => x.Rating)</p> 
    <p>Body: @Html.TextBoxFor(x => x.Body)</p> 
    <input type="submit" value="Save"/> 
    Html.ActionLink("Cancel", "Index", "Home"); 
} 

我生成的標籤是這樣的:

<a href="/Product/AddReview?ProductId=9">Leave a Review</a> 

編輯

在修復了鏈接問題後,我意識到我仍然收到錯誤的原因是因爲RedirectToAction調用在我的控制器中斷了。多麼愚蠢的錯誤!

+1

什麼代碼來創建窗體看起來像? – 2012-04-16 16:30:31

回答

2
@Html.ActionLink("Leave a Review", "AddReview", "Product", new { @id = Model.ProductId }, null) 

此,如果你在你的產品編號屬性的有效valie這種模式

<a href="/Product/AddReview/9">Leave a Review</a> 

請確保您有正確加載ProductId屬性值應該產生類似下面的鏈接。

您可以使用@符號作爲與HTML屬性具有相同名稱的參數的前綴。看我用@id代替id

+0

這會生成正確的鏈接。我仍然得到錯誤,我懷疑這是因爲我沒有正確加載價值到我的表格... – Johannes 2012-04-16 16:46:20

+0

但審查仍然發佈。 – Johannes 2012-04-16 16:52:40

0

這聽起來像你沒有在窗體中設置ProductId。您需要設置表單動作以在路線中包含ID:@Html.BeginForm("AddReview","Product", new {Id = Model.ProductId})或包含productId的隱藏輸入,例如, @Html.Hidden("id",Model.ProductId")

+0

那麼我如何將ID傳遞給表單呢? – Johannes 2012-04-16 16:40:22

+0

@DarinDimitrov,最好在表單動作或隱藏中傳遞ID?優點和缺點... – Romias 2012-04-16 16:49:21

+0

@Romias我認爲如果形式值不同,表格值會獲勝。 – 2012-04-16 17:08:50

2
<a href="/Product/AddReview?ProductId=9">Leave a Review</a> 

不好。你應該:

<a href="/Product/AddReview/9">Leave a Review</a> 

或:

<a href="/Product/AddReview?id=9">Leave a Review</a> 

,因爲你的控制器動作需要叫id非空的int參數。你得到這個錯誤的網址的原因可能是因爲你已經搞亂了你的路線。

+0

雖然我沒有碰過我的路線。這是默認的{controller}/{action}/{id}設置。 – Johannes 2012-04-16 16:41:47

+0

也許這是你的形式。你試過包括路由參數:@using(Html.BeginForm(「AddReview」,「Product」,new {id = Model.ProductId},FormMethod.Post))'? – 2012-04-16 16:44:53

+0

所以,我得到的錯誤,但評論仍然發佈。這很愚蠢。 – Johannes 2012-04-16 16:52:17