【问题标题】:Error: The parameters dictionary contains a null entry for parameter 'id' of non-nullable type错误:参数字典包含不可为空类型的参数“id”的空条目
【发布时间】:2018-11-24 00:46:20
【问题描述】:

尝试使用搜索时出错。这是我的错误:

参数字典包含“MvcSimpleModelBinding.Controllers.PersonController”中方法“System.Web.Mvc.ActionResult Trazi(Int32)”的不可为空类型“System.Int32”的参数“id”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。

这是我的控制器:

public class PersonController : Controller {
    public ActionResult Search(int id)
    {
        var mm = DataBase.getById(id);
        return View(mm);
    }
 }

我的班级数据库:

public class DataBase
{
    private static List<Person> people = new List<Person>();
    private static int _nextId = 1;        
    public static List<Person> getAll() {
        return people;} 
    public static Person getById(int id)
    {
        var buscar = people.Find(x => x.Id == id);
        if (buscar == null)
        {
            throw new ArgumentNullException("id");
        }
        return buscar;}

查看

@using (Html.BeginForm("Search", "Person",FormMethod.Get))
  {    
 <form>
 Title: @Html.TextBox("id");
 <input type="submit" 
 name="name"value="Search"/>
 </form>   
   }
  <p>@Html.ActionLink("Create New", 
 "Create")
  </p>
  <table class="table">
  <tr>
  <th>
 @Html.DisplayNameFor(model => model.Id)
</th>
 <th>@Html.DisplayNameFor(model => 
  model.Name)
    </th>
 <th>@Html.DisplayNameFor(model => 
   model.Age)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Street)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.City)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.State)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Zipcode)
    </th>
    <th></th>
</tr>

@foreach (var item in Model)
{
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Id)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Age)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Street)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.City)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.State)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Zipcode)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
        @Html.ActionLink("Details", "Details", new { id = item.Id }) |
        @Html.ActionLink("Delete", "Delete", new { id = item.Id })
    </td>
</tr>
}

路由:

public class RouteConfig{
    public static void 

    RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }

【问题讨论】:

  • 你尝试的 URL 是什么?
  • 您的嵌套表单是无效的 html(首先删除内部的 &lt;form&gt; 标签)
  • 根据您的路由,您应该访问像 /search/101 这样的 search 操作方法,其中 101 可以替换为任何有效的 int32 值。

标签: c# asp.net-mvc


【解决方案1】:

该错误表示搜索请求中没有id参数,这就是MVC甚至无法调用action方法的原因。

现在,让我们找出请求错误的原因。让我们看看视图中有什么:

@using (Html.BeginForm("Search", "Person",FormMethod.Get))
{    
    <form>
        Title: @Html.TextBox("id");
        <input type="submit" name="name" value="Search"/>
    </form>   
}

Html 助手Html.BeginForm 生成一个新表单(&lt;form&gt;&lt;/form&gt; 标签),但随后您还添加了另一个表单,因此结果 html 为:

<form method="get" ...>
    <form>
        Title:....
    </form>
</form>

这是一个问题,因为 HTML 不支持嵌套表单。要修复它,您应该在 using:

中删除额外的 &lt;form&gt; 标签
@using (Html.BeginForm("Search", "Person",FormMethod.Get))
{    
    Title: @Html.TextBox("id");
    <input type="submit" name="name" value="Search"/>   
}

【讨论】:

  • 感谢您的回复,但现在我有另一个错误:值不能为空。参数名称:id..这个错误不知道怎么解决
【解决方案2】:

你的问题就在这里。

public ActionResult Search(int id)

您为操作设置了一个参数,因此每次输入操作时都需要一个参数:int id。例如,如果您从另一个页面输入相应的查看页面(即搜索页面),例如索引,您要做的就是将您的 ruote 价值与您的原始 URL 结合起来。下面是我的例子:

另一种观点:

@Html.ActionLink("Search", "Home", new { id = 2 })

示例实际上等于/Home/Search/2,格式是/[Controller]/[Action]/[Route value],这样就不会再报错了。

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多