Asp.net mvc 4 如何在MVC中同时使用Ajax.BeginForm和Html.BeginForm解决空模型问题
我是MVC的新手,一直在把模态传递给控制器。 我在SO中读过很多类似的帖子,但都没有用 在这里,我有一个输入订单详细信息的视图。 用户将输入订单项目详细信息(使用ajax.BeginForm),当他单击保存时,整个订单将保存在后端(使用Html.BeginForm)。Ajax.BeginForm工作正常,并正确传递和显示记录。但是Html.BeginForm将模型作为nothing传递。 这是我的密码 我的车型Asp.net mvc 4 如何在MVC中同时使用Ajax.BeginForm和Html.BeginForm解决空模型问题,asp.net-mvc-4,model-view-controller,model,parameter-passing,Asp.net Mvc 4,Model View Controller,Model,Parameter Passing,我是MVC的新手,一直在把模态传递给控制器。 我在SO中读过很多类似的帖子,但都没有用 在这里,我有一个输入订单详细信息的视图。 用户将输入订单项目详细信息(使用ajax.BeginForm),当他单击保存时,整个订单将保存在后端(使用Html.BeginForm)。Ajax.BeginForm工作正常,并正确传递和显示记录。但是Html.BeginForm将模型作为nothing传递。 这是我的密码 我的车型 public class OrderItemsModel {
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; }
}
公共类OrderItemsModel
{
公共字符串SrNo{get;set;}
公共int?项目代码{get;set;}
公共字符串ItemName{get;set;}
公共小数?数量{get;set;}
公共十进制?速率{get;set;}
公共小数?金额{get;set;}
}
公共类排序模型
{
公共字符串OrderNumber{get;set;}
公共字符串OrderDate{get;set;}
公共int?客户代码{get;set;}
公共字符串CustomerName{get;set;}
公共字符串注释{get;set;}
//按顺序选择的项目列表
已选择公共列表项{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>
@model OrderApplication.Models.OrderModel
@{
ViewBag.Title=“Index”;
Model.ItemsSelected=ViewBag.getlist;
}
@使用(Ajax.BeginForm(“UpdateItemList”、“Order”、新的AjaxOptions{HttpMethod=“POST”、UpdateTargetId=“selectedtable”}))
{
订单输入
//订单号和日期
@Html.LabelFor(model=>model.OrderNumber,“OrderNo”):
@Html.TextBoxFor(model=>model.OrderNumber,新的{@class=“form control”,@readonly=“readonly”})
@Html.LabelFor(model=>model.OrderDate,“Date”):
@Html.TextBoxFor(model=>model.OrderDate,新的{@class=“form control”})
//条目表
@Html.Partial(“_selectTable”,Model);
}
@*主要保存*@
@使用(Html.BeginForm(“SaveData”,“Order”,new{Order=Model,id=“loginform”,@class=“justify content center”}))
{
}
我的控制器
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);
}
}
}
公共类OrderController:控制器
{
公共列表dd=新列表();
[HttpPost]
public ActionResult SaveData(订单模型订单,字符串id)
{
if(order==null)//顺序总是空的
{
返回视图(订单);
}
if(order.CustomerCode==0)
{
返回视图(订单);
}
返回视图(订单);
}
}
}
您不应该同时使用Ajax.BeginForm和Html.BeginForm,因为它不起作用。请查看此帖子,以确定您希望选择哪一个:
如果您仍然想使用Html.BeginForm,只需将using语句移动到页面顶部的Ajax.BeginForm,这样表单就会覆盖所有字段,并且模型不会为空。看起来您只在Html表单中包含了输入按钮。请尝试使用Html.BeginForm区域将您希望发送到@use内控制器的所有字段/控件包含在内。看看这些例子,这对您的情况可能很有用:所有字段/控件都在Ajax.BeginForm中。我曾尝试在Html.BeginForm(嵌套)之后关闭Ajax.BeginForm,但没有帮助。我需要两个字段。你能推荐一种方法吗?没错,嵌套Ajax.beginfour和Html.beginfour是行不通的。您应该选择只使用其中一个,并将其放置在设置了Ajax.BeginForm的位置,这样您就可以像您所说的那样覆盖所有表单字段。