Asp.net mvc 4 如何在MVC中同时使用Ajax.BeginForm和Html.BeginForm解决空模型问题

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 {

我是MVC的新手,一直在把模态传递给控制器。 我在SO中读过很多类似的帖子,但都没有用

在这里,我有一个输入订单详细信息的视图。 用户将输入订单项目详细信息(使用ajax.BeginForm),当他单击保存时,整个订单将保存在后端(使用Html.BeginForm)。Ajax.BeginForm工作正常,并正确传递和显示记录。但是Html.BeginForm将模型作为nothing传递。 这是我的密码

我的车型

 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.BeginFormHtml.BeginForm,因为它不起作用。请查看此帖子,以确定您希望选择哪一个:


如果您仍然想使用Html.BeginForm,只需将using语句移动到页面顶部的Ajax.BeginForm,这样表单就会覆盖所有字段,并且模型不会为空。

看起来您只在Html表单中包含了输入按钮。请尝试使用Html.BeginForm区域将您希望发送到@use内控制器的所有字段/控件包含在内。看看这些例子,这对您的情况可能很有用:所有字段/控件都在Ajax.BeginForm中。我曾尝试在Html.BeginForm(嵌套)之后关闭Ajax.BeginForm,但没有帮助。我需要两个字段。你能推荐一种方法吗?没错,嵌套Ajax.beginfour和Html.beginfour是行不通的。您应该选择只使用其中一个,并将其放置在设置了Ajax.BeginForm的位置,这样您就可以像您所说的那样覆盖所有表单字段。