我有一个带有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")
答案 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);
}
可能不是最好的方法,但是效果很好。