2012-04-16 79 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

相关问题