表单由于ID冲突未将值返回给控制器操作

时间:2019-06-03 15:05:19

标签: c# asp.net-mvc asp.net-mvc-4 razor

我有一个带有DropDownListFor的表格。当我从下拉列表中选择ID时,选择一个日期并单击Submit,我会收到错误消息:

  

参数字典包含方法'System.Web.Mvc.ActionResult Index(Int32,System.DateTime,NameSpace.ViewModels.TerminalReceiptPostData)'的非空类型'System.Int32'的参数'CasinoID'的空条目在“ Namesppace.Controllers.TerminalReceiptsController”中。可选参数必须是引用类型,可为空的类型,或者必须声明为可选参数。   参数名称:参数

仅使用常规的Input标记并手动键入即可。但是当我添加DropDownListFor时会出现此问题。我设置DDL错误吗?关于为什么会发生其他问题?下面是一些代码。

控制器操作:

    [HttpPost]
    public ActionResult Index(int CasinoID, DateTime Date)
    {
         var model = TRBL.GetTransactionTestsData(CasinoID, Date);

        return View(model);
    }

查看:

@using (Html.BeginForm("Index", "TerminalReceipts", new { id = "submitForm" }))
 {

    <div>
        @*<input type="text" name="CasinoID" placeholder="Enter Casino ID" id="cIdSearch" />*@
        @Html.DropDownListFor(o => o.TerminalReceiptPostData.CasinoIdDDL, Model.TerminalReceiptPostData.CasinoIdDDL, new { id = "CasinoID"})
        <input id="datepicker" class="datepicker-base" name="Date" placeholder="MM/DD/YYY" type="text" />
        <button type="submit" class="btn btn-sm  btn-primary" id="search" onclick="checkField()"> Search Transactions</button>
    </div>

 }

编辑更新

因此,我能够更改结构的方式,现在可以将CasinoID正确地传递给控制器​​操作。下面是更改...但是,在执行操作以返回模型之后,我得到的obj引用未设置为obj err实例。

操作:

      [HttpPost]
    public ActionResult Index(int CasinoID, DateTime Date)
    {

        var id = Int32.Parse(Request.Form["CasinoID"].ToString());

        var model = TRBL.GetTransactionTestsData(id, Date);

        return View(model);
    }

更改为DDL:

                @Html.DropDownList("CasinoID", Model.TerminalReceiptPostData.CasinoIdDDL, "Select Casino")

2 个答案:

答案 0 :(得分:1)

int CasinoID将由名称为CasinoID的表单域绑定。我认为@ Html.DropDownListFor不会生成您想要的“名称”。

您可以像这样明确添加名称

@Html.DropDownListFor(o => o.TerminalReceiptPostData.CasinoIdDDL, Model.TerminalReceiptPostData.CasinoIdDDL, new { id = "CasinoID", name="CasinoID"})

或者更好地创建一个具有CasinoID,Date和CId字段的ViewModel,并在该ViewModel实例上使用BindProperty

答案 1 :(得分:0)

好的,所以我弄清楚发生了什么事。

实际上,我有两个单独的控制器动作,分别称为Index。一个用于发布,一个用于获取。由于我现在要在POST上发回一个模型,因此下拉列表没有被下拉列表“重新填充”。所以我只是从GET操作中调用了一个电话并将其添加到帖子中。

        [HttpPost]
    public ActionResult Index(int CasinoID, DateTime Date)
    {

            var id = Int32.Parse(Request.Form["CasinoID"].ToString());

            var model = TRBL.GetTransactionTestsData(id, Date);

            model.TerminalReceiptPostData = TRBL.GetCasinosDDL();

            return View(model);

    }

可能不是最好的方法,但是效果很好。