【发布时间】:2015-07-09 12:26:36
【问题描述】:
我在局部视图中有一个表单,可以正确显示我想要的数据。但是,当提交表单时,传递给控制器的模型为空。我不确定是否因为它是局部视图,所以一切似乎对我来说都是正确的。
局部视图
@model CustomerPickUp.Web.Models.SalesOrderModel
<h3 id="resultHeader">Search Results</h3>
<div id="resultsContainer">
<div id="container">
<table class="resultTable">
@using (Html.BeginForm("UpdateQueue", "Order", FormMethod.Post, new {id = "updateQueueForm"}))
{
@Html.ValidationSummary(true)
for (var i = 0; i < Model.SalesOrderList.Count(); i++)
{
<tr>
<td>
@Html.CheckBoxFor(it => Model.SalesOrderList[i].IsSelected)
</td>
<td style="text-align: right;">
@Html.Label("CustomerName", "Customer Name: ")
<br/>
@Html.Label("OrderNumber", "Order Number: ")
</td>
<td style="text-align: left;">
@Html.DisplayFor(it => Model.SalesOrderList[i].CustomerName)
@Html.HiddenFor(it => Model.SalesOrderList[i].CustomerName)
<br/>
@Html.DisplayFor(it => Model.SalesOrderList[i].OrderNumber)
@Html.HiddenFor(it => Model.SalesOrderList[i].OrderNumber)
</td>
</tr>
}
}
</table>
</div>
</div>
<div class="searchTypeSelection">
@(Html.Kendo().Button()
.Name("saveButton")
.Content("Add to Queue")
.HtmlAttributes(new {@class = "medium-btn"})
.Events(e => e.Click("save_Clicked"))
)
</div>
控制器
public ActionResult UpdateQueue(SalesOrderModel SALESorder)
{
if (SALESorder.SalesOrderList != null)
{
foreach (SalesOrder item in SALESorder.SalesOrderList)
{
if (item.IsSelected)
{
AddToOrderQueue(item);
}
}
}
return RedirectToAction("Orders");
}
主视图
@{
Layout = "~/Views/Shared/_CurrentQueueLayout.cshtml";
}
<div id="searchControls">
@using (Ajax.BeginForm("ProcessSearch", "Search", new AjaxOptions { UpdateTargetId = "resultSection" }, new { id = "searchForm", @class = "pure-Form" }))
{
<div class="searchTypeSelection">
@(Html.Kendo().DropDownList()
.Name("searchOption")
.DataTextField("Text")
.OptionLabel("Search By...")
.DataValueField("Value")
.BindTo(new List<SelectListItem>()
{
new SelectListItem()
{
Text = "SO Number",
Value = "2"
},
new SelectListItem()
{
Text = "Phone Number",
Value = "1"
}
})
)
<br />
<br />
<input type="text" id="searchString" name="searchString" disabled="disabled" />
@(Html.Kendo().Button()
.Name("searchButton")
.Content("Search")
.Events(e => e.Click("search_clicked"))
.HtmlAttributes(new { @class = "medium-btn" })
)
</div>
}
</div>
<div id="resultSection">
</div>
<script type="text/javascript">
$(document).ready(function () {
//clear all fields
$("#searchString").val("");
$("#searchString").attr("disabled", "disabled");
});
$("#searchOption").change(function () {
var dropdownlist = $("#searchOption").data("kendoDropDownList");
var index = parseInt($("#searchOption").val());
alert(index);
if (dropdownlist.value() == 2) {
$("#searchString").inputmask("************");
$("#searchString").val("");
$("#searchString").removeAttr("disabled");
} else if (dropdownlist.value() == 1) {
$("#searchString").inputmask("999-999-9999");
$("#searchString").removeAttr("disabled");
$("#searchString").val("");
} else {
$("#searchString").attr("disabled", "disabled");
$("#searchButton").addClass("mobileButtonDisabled");
}
});
$('#searchString').on('input', function () {
var maskedtextbox = $("#searchString").val();
var dropdownlist = $("#searchOption").data("kendoDropDownList");
if ((dropdownlist.value() == 1 || dropdownlist.value() == 2) && maskedtextbox != "") {
$("#searchButton").removeClass("mobileButtonDisabled");
} else {
$("#searchButton").addClass("mobileButtonDisabled");
}
});
function search_clicked(e) {
e.preventDefault();
$("#searchForm").submit();
};
function save_Clicked(e) {
e.preventDefault();
$("#updateQueueForm").submit();
};
</script>
更新
我更改了那个动作的签名,但这并没有改变任何东西。查看生成的 HTML 后,我注意到我的元素没有在表单中呈现。关于为什么的任何想法?
<form id="updateQueueForm" method="post" action="/Order/UpdateQueue"> </form>
<tbody>
<tr>
<td>
<td style="text-align: right;">
<td style="text-align: left;">
<td>
<td style="text-align: right;">
<td style="text-align: left;">
【问题讨论】:
-
保存按钮应该在表单中。它没有上下文。
-
我手动调用表单提交,这是有效的。控制器动作被击中,只是传递了 null。
-
函数 save_Clicked(e) { e.preventDefault(); $("#updateQueueForm").submit(); };
-
将所有相关代码放入问题中。
-
我更新了代码以包含主视图和 javascript。我之前有这段代码工作过,我能想到的唯一改变是我使用的是局部视图。如果我只使用 displayfor,则在您提交表单时不会为该字段提交任何值。
标签: asp.net asp.net-mvc asp.net-mvc-4 c#-4.0