参数字典包含参数的空条目

时间:2010-05-19 08:04:01

标签: asp.net-mvc

<%using (Html.BeginForm("OrderDevice", "ImportXML", FormMethod.Post))
{ %>

<table id="OrderDevices" class="data-table">
    <tr>

        <th>
            DeviceId
        </th>
        <th>
            Id
        </th>
        <th>
            OrderId
        </th>
    </tr>

<% foreach (var item in Model) { %>

    <tr>

        <td>
            <input readonly="readonly" class="" id="DeviceId" type="text" 
                name="<%= Html.Encode(item.DeviceId) %>"  
                value="<%= Html.Encode(item.DeviceId) %>" style="width: 61px" />
        </td>
        <td>
            <input readonly="readonly" class="" id="c" type="text" 
                name= "<%= Html.Encode(item.Id) %>"  value="
    <%= Html.Encode(item.Id) %>" 
                style="width: 50px" />      
        </td>
        <td>
            <input readonly="readonly" class="" id="OrderId" type="text" 
                name= " <%= Html.Encode(item.OrderId) %>"  
                value="<%= Html.Encode(item.OrderId) %> " style="width: 49px" /> 
        </td>
    </tr>

<% } %>

</table>

<input type="submit" value="Create"/>
<%} %>

我的控制器操作:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult OrderDevice(int id)
    {   
        try
        {
            // TODO: Add insert logic here        
            orderdevice ord = new orderdevice();
            ord.Id = System.Convert.ToInt32(Request.Form["Id"]);
            ord.OrderId = System.Convert.ToInt32(Request.Form["OrderId"]);
            ord.DeviceId = System.Convert.ToInt32(Request.Form["DeviceId"]);

            XMLEntities.AddToorderdevice(ord);
            XMLEntities.SaveChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View("Index");
        }
    }

发布表单时出现此错误:参数字典包含非可空类型'System.Int32'参数'id'的空条目,方法'System.Web.Mvc.ActionResult OrderDevice(Int32)'in 'MvcKVteam.Controllers.ImportXMLController'。可选参数必须是引用类型,可空类型,或者声明为可选参数。 参数名称:参数

如何解决?

3 个答案:

答案 0 :(得分:3)

首先,我建议您使用MVC自动处理参数,而不是自己从请求中删除它们。你的控制器动作有一个id参数似乎被忽略了 - 使用它并添加其他类似参数来获取输入参数。

其次,你的HTML看起来有点偏。您正在使用设备ID,商品ID和订单ID 作为输入元素名称。这意味着您不会deviceId=123&itemId=456&orderId=789获得123=123&456=456&789=789而不是非常有用!尝试将输入字段更改为:

<input ... name="deviceId" value="<%= Html.Encode(item.DeviceId) %>" ... />

然后,您可以在控制器中使用deviceId这样的参数:

public ActionResult OrderDevice(int deviceId, int itmId, int orderId)
{
    // ...
}

这样做,你根本不会自己使用Request.Form [...]。

答案 1 :(得分:0)

错误表示,您从视图发送到控制器的参数名称不同。

示例:

@Html.ActionLink(item.PropertyId, "View", new { @id= item.PropertyId })


public ActionResult Edit(int propId)
{
            var result = _service.GetProperty(propId);
            return View("Index", result);
}

在此代码中,参数“id”从视图传递。但实际的参数名称是'propId'。更改名称将修复此错误。

答案 2 :(得分:0)

此错误意味着mvc可以找到必须作为参数传递的ID属性的值。要解决此问题,请在控制器上包含以下内容。

public ActionResult OrderDevice(string id)     {

         ViewBag.S = id;

        if (!string.IsNullOrEmpty(id))
        {
            int idint = Convert.ToInt16(id);
            if (ModelState.IsValid)
            {
                try
    {
        // TODO: Add insert logic here        
        orderdevice ord = new orderdevice();


        XMLEntities.AddToorderdevice(ord.Search(idint));
        XMLEntities.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View("Index");
    }
            }
        }

        return View();

    }

Seacrh假设你的程序包含一个搜索Device.Hope的方法,这会有所帮助。