我正在建立一个有产品的网站,您可以对产品进行评论。我在产品页面上有一个链接,上面写着“发表评论”
在我的代码中,它看起来像这样:
@Html.ActionLink("Leave a Review", "AddReview", "Product", new { id = Model.ProductId }, null)
当我运行我的应用程序时,链接工作正常,但是当我提交评论时,它会崩溃并说:
参数字典包含参数'id'的空条目 方法的非可空类型'System.Int32' 'System.Web.Mvc.ActionResult Product(System.String,Int32)' 'MyProject.Controllers.ProductController'。可选参数 必须是引用类型,可空类型,或声明为 可选参数。参数名称:参数
如果我的ActionLink中有new { id = Model.ProductId }
,则只会出现此错误。
这似乎是ProductId为null,但这是不可能的。要首先加载产品页面,需要使用ProductId,另外我使用RenderAction,使用相同的ID在页面上显示有关该产品的评论:
@{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调用在我的控制器中被破坏了。多么愚蠢的错误!
答案 0 :(得分: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参数。你得到这个错误网址的原因可能是因为你弄乱了你的路线。
答案 1 :(得分:2)
@Html.ActionLink("Leave a Review", "AddReview", "Product", new { @id = Model.ProductId }, null)
如果此模型的ProductId属性中有有效值,则应生成如下所示的链接
<a href="/Product/AddReview/9">Leave a Review</a>
确保正确加载ProductId
属性值。
您可以使用@
符号作为参数的前缀,该参数与HTML attribues具有相同的名称。请参阅我使用@id
而不是id
答案 2 :(得分:0)
听起来您没有在表单中设置ProductId。您需要设置表单操作以在路由中包含ID:@Html.BeginForm("AddReview","Product", new {Id = Model.ProductId})
或包含productId的隐藏输入,例如@Html.Hidden("id",Model.ProductId")