如何在 MVC 中同时使用 Ajax.BeginForm 和 Html.BeginForm 解决空模型问题
How to solve empty model trouble using both Ajax.BeginForm and Html.BeginForm in MVC
我是 MVC 的新手,一直坚持将模态传递给控制器。
我在 SO 中阅读了许多类似的线程,但无济于事。
在这里,我有一个用于输入订单详细信息的视图。
用户将输入订单项目详细信息(使用 ajax.BeginForm),当他点击保存时,整个订单将保存在后台(使用 Html.BeginForm)。 Ajax.BeginForm 工作正常并通过 + 正确显示记录。但是 Html.BeginForm 没有传递模型。
这是我的代码...
我的模特
public class OrderItemsModel
{
public string SrNo { get; set; }
public int? ItemCode { get; set; }
public string ItemName { get; set; }
public Decimal? Qty { get; set; }
public Decimal? Rate { get; set; }
public Decimal? Amount { get; set; }
}
public class OrderModel
{
public string OrderNumber { get; set; }
public string OrderDate { get; set; }
public int? CustomerCode { get; set; }
public string CustomerName { get; set; }
public string Note { get; set; }
//List of items selected in Order
public List<OrderItemsModel> ItemsSelected { get; set; }
}
从我的观点中摘录
@model OrderApplication.Models.OrderModel
@{
ViewBag.Title = "Index";
Model.ItemsSelected = ViewBag.getlist;
}
@using (Ajax.BeginForm("UpdateItemList", "Order", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "selectedtable" }))
{
<h2 style="margin-left:5%;">Order Entry</h2>
//Order No & Date
<div class="row">
<div class="col-sm-6">
<div class="col-sm-3">
@Html.LabelFor(model => model.OrderNumber, "OrderNo"):
</div>
<div class="col-sm-3">
@Html.TextBoxFor(model => model.OrderNumber, new { @class = "form-control", @readonly = "readonly" })
</div>
</div>
<div class="col-sm-6">
<div class="col-sm-3">
@Html.LabelFor(model => model.OrderDate, "Date"):
</div>
<div class="col-sm-3">
@Html.TextBoxFor(model => model.OrderDate, new { @class = "form-control" })
</div>
</div>
</div>
<br />
//Table of entries
<div id="selectedtable">
@Html.Partial("_selectTable", Model);
</div>
<br />
}
@*Main Save*@
<div class="row">
<div class="col-sm-12">
<div class="col-sm-3">
@using (Html.BeginForm("SaveData", "Order", new { order = Model, id = "loginform", @class = "justify-content-center" }))
{
<input type="submit" value="Save Order" class="btn btn-success" />
}
</div>
<div class="col-sm-3">
<input type="button" class="btn btn-success" value="Clear Form" onclick="location.href='@Url.Action("Clear", "Order")'" />
</div>
</div>
</div>
我的控制器
public class OrderController : Controller
{
public List<OrderItemsModel> dd = new List<OrderItemsModel>() ;
[HttpPost]
public ActionResult SaveData(OrderModel order, string id)
{
if (order == null) //order is always Nothing
{
return View(order);
}
if (order.CustomerCode == 0)
{
return View(order);
}
return View(order);
}
}
}
你不应该同时使用 Ajax.BeginForm 和 Html.BeginForm,因为它不起作用。请检查此 post,这可能有助于您决定选择哪一个:
https://forums.asp.net/t/1757936.aspx?When+to+use+Html+BeginForm+vs+ajax+BeginForm
如果你还想使用Html.BeginForm,只需移动using语句来替换你的 Ajax.BeginForm在页面顶部,所以表单覆盖所有字段,模型不会为空。
我是 MVC 的新手,一直坚持将模态传递给控制器。 我在 SO 中阅读了许多类似的线程,但无济于事。
在这里,我有一个用于输入订单详细信息的视图。 用户将输入订单项目详细信息(使用 ajax.BeginForm),当他点击保存时,整个订单将保存在后台(使用 Html.BeginForm)。 Ajax.BeginForm 工作正常并通过 + 正确显示记录。但是 Html.BeginForm 没有传递模型。 这是我的代码...
我的模特
public class OrderItemsModel
{
public string SrNo { get; set; }
public int? ItemCode { get; set; }
public string ItemName { get; set; }
public Decimal? Qty { get; set; }
public Decimal? Rate { get; set; }
public Decimal? Amount { get; set; }
}
public class OrderModel
{
public string OrderNumber { get; set; }
public string OrderDate { get; set; }
public int? CustomerCode { get; set; }
public string CustomerName { get; set; }
public string Note { get; set; }
//List of items selected in Order
public List<OrderItemsModel> ItemsSelected { get; set; }
}
从我的观点中摘录
@model OrderApplication.Models.OrderModel
@{
ViewBag.Title = "Index";
Model.ItemsSelected = ViewBag.getlist;
}
@using (Ajax.BeginForm("UpdateItemList", "Order", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "selectedtable" }))
{
<h2 style="margin-left:5%;">Order Entry</h2>
//Order No & Date
<div class="row">
<div class="col-sm-6">
<div class="col-sm-3">
@Html.LabelFor(model => model.OrderNumber, "OrderNo"):
</div>
<div class="col-sm-3">
@Html.TextBoxFor(model => model.OrderNumber, new { @class = "form-control", @readonly = "readonly" })
</div>
</div>
<div class="col-sm-6">
<div class="col-sm-3">
@Html.LabelFor(model => model.OrderDate, "Date"):
</div>
<div class="col-sm-3">
@Html.TextBoxFor(model => model.OrderDate, new { @class = "form-control" })
</div>
</div>
</div>
<br />
//Table of entries
<div id="selectedtable">
@Html.Partial("_selectTable", Model);
</div>
<br />
}
@*Main Save*@
<div class="row">
<div class="col-sm-12">
<div class="col-sm-3">
@using (Html.BeginForm("SaveData", "Order", new { order = Model, id = "loginform", @class = "justify-content-center" }))
{
<input type="submit" value="Save Order" class="btn btn-success" />
}
</div>
<div class="col-sm-3">
<input type="button" class="btn btn-success" value="Clear Form" onclick="location.href='@Url.Action("Clear", "Order")'" />
</div>
</div>
</div>
我的控制器
public class OrderController : Controller
{
public List<OrderItemsModel> dd = new List<OrderItemsModel>() ;
[HttpPost]
public ActionResult SaveData(OrderModel order, string id)
{
if (order == null) //order is always Nothing
{
return View(order);
}
if (order.CustomerCode == 0)
{
return View(order);
}
return View(order);
}
}
}
你不应该同时使用 Ajax.BeginForm 和 Html.BeginForm,因为它不起作用。请检查此 post,这可能有助于您决定选择哪一个: https://forums.asp.net/t/1757936.aspx?When+to+use+Html+BeginForm+vs+ajax+BeginForm
如果你还想使用Html.BeginForm,只需移动using语句来替换你的 Ajax.BeginForm在页面顶部,所以表单覆盖所有字段,模型不会为空。