【问题标题】:The parameters dictionary contains a null entry for parameter... mvc参数字典包含参数的空条目... mvc
【发布时间】:2018-01-21 07:04:20
【问题描述】:

我将视图和控制器放在这里,我的问题是在发布值后出现此错误:

参数字典包含“Landing.UI.Areas.cpanel”中方法“System.Web.Mvc.ActionResult DeleteQuestionDo(Int32)”的不可为空类型“System.Int32”的参数“id”的空条目。 Controllers.BestDestinationResultController'。可选参数必须是引用类型、可空类型或声明为可选参数。 参数名称:参数

控制器:

[HttpPost]
public ActionResult DeleteQuestionDo(int id)
{
    Logic.BestDestination.BestDestinationLogic bestDestLigic = new Logic.BestDestination.BestDestinationLogic();
    bestDestLigic.deleteQuestion(id);
    return RedirectToAction("DeleteQuestion");
}

查看:

@model Landing.UI.Areas.cpanel.Models.BestDestinationQuestionList
....
@Html.BeginForm("DeleteQuestionDo", "BestDestinationResult", FormMethod.Post)
{
    @foreach (var m in Model.BestDestQuesList)
    {
        <input type="hidden" name="@m.QuestionId" />
        <br />
        <a href="@Url.Action("DeleteQuestionDo", "BestDestinationResult", new { id = m.QuestionId })">@m.Question</a>
        <input name="@m.QuestionId" type="submit"  value="حذف کامل سؤال"  />
    }
}

【问题讨论】:

  • 您查看代码没有意义。您有一个包含多个隐藏输入的表单,其名称属性无效且无法绑定到任何内容,并且由于它没有value 属性,因此它不会提交任何值。您还可以使用与您的 DeleteQuestionDo() 方法相同的方法链接。
  • 你到底想在这里做什么。您删除一个对象,因此它应该是一个 [HttpPost] 方法,而不是 GET - 即从视图中删除您的链接。您应该拥有的是循环中的多个表单,并在 `BeginForm() 方法中添加路由值
  • sry that link(url.action) 是一个检查我的逻辑的测试,我为隐藏的输入添加了 value 属性,但我得到了同样的错误。
  • 因为name 不匹配(您没有生成name="id" - 查看您生成的html)。但是视图没有意义——你有一个表单,但有多个输入。当您点击提交按钮时,它会回发每个输入的所有名称/值对! (同样,您需要创建多个表单,每个问题一个)
  • 我把 beginForm 放在 foreach 中,但还是一样的错误!

标签: c# asp.net-mvc


【解决方案1】:

您的代码和逻辑存在多个问题,包括

  • 您方法中的参数名为id,但您没有生成 任何带有name="id" 的输入(它们被命名为12 等 - 即 QuestionId 属性的值,它不是有效的 c# 属性 无论如何都要命名)
  • 您的隐藏输入没有value 属性,所以总是 回帖为空
  • 您生成的多个链接使 GET 指向一个方法 不存在
  • 您对@Html.BeginForm(..) 的使用不正确,不会生成 结束 &lt;/form&gt; 标记 - 它必须是 @using (Html.BeginForm(...)) 或者您需要包含 Html.EndForm()

即使您确实添加了正确的名称和值属性,您也会发回集合中所有 QuestionId 值的数组,这毫无意义(您只想删除一个)

您需要为集合中的每个项目生成一个&lt;form&gt;。在每个表单中,您可以添加一个&lt;input type="hidden" name="id" value="@m.QuestionId" /&gt;,但是将值添加为路由属性更容易。

将您的代码更改为

@foreach (var m in Model.BestDestQuesList)
{
    <div>@m.Question</div>
    @using (Html.BeginForm("DeleteQuestionDo", "BestDestinationResult", new { id = @m.QuestionId} ))
    { 
        <input type="submit"  value="حذف کامل سؤال"  />
    }
}

附带说明,您使用return RedirectToAction("DeleteQuestion"); 表明您可能会重定向回相同的视图。如果是这种情况,您应该考虑使用 ajax 将 QuestionId 值提交给 'Delete' 方法(并在成功回调中,从 DOM 中删除关联的元素),这将提高性能

【讨论】:

  • 我遇到了同样的问题,通过检查和同步方法和路由配置中的参数名称来解决。
猜你喜欢
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2013-05-29
  • 2013-12-15
相关资源
最近更新 更多