即使发送了请求,ASP.NET MVC 表单数据也没有保存到数据库中

Posted

技术标签:

【中文标题】即使发送了请求,ASP.NET MVC 表单数据也没有保存到数据库中【英文标题】:ASP.NET MVC Form data is not being saved into database even though the request is sent 【发布时间】:2021-12-25 12:12:27 【问题描述】:

我想使用带有 HttpPost 的 Form 将数据保存在数据库中,但它没有被保存。

这是我的控制器 (CustomersController)

添加新客户的路径(基本上是返回一个带有表单的视图):

[Route("customers/new")]
        public ActionResult New()
        
            var membershipTypes = _context.MembershipTypes.ToList();
            var viewModel = new NewCustomerViewModel
            
                MembershipTypes = membershipTypes
            ;
            return View(viewModel);
        

发布方法

[HttpPost]
        [ValidateAntiForgeryToken]
        [Route("customers/create")]
       
        public ActionResult Create(Customer customer)
        
            if(!ModelState.IsValid)
            
                var viewModel = new NewCustomerViewModel
                
                    Customer = customer,
                    MembershipTypes = _context.MembershipTypes.ToList()
                ;
                return View("New", viewModel);
            
            if(customer.Id == 0) 
                _context.Customers.Add(customer);
            else
            

                var customerInDb = _context.Customers.Single(c => c.Id == customer.Id);
                customerInDb.Name = customer.Name;
                customerInDb.Birthdate = customer.Birthdate;
                customerInDb.MemberShipTypeId = customer.MemberShipTypeId;
                customerInDb.IsSubscribedToNewsletter = customer.IsSubscribedToNewsletter;
            
                _context.SaveChanges();

                return RedirectToAction("Index");   //data is not being saved to db and redirection also does not happen
           
        

这是查看的代码:

@model Vidly.ViewModels.NewCustomerViewModel
  @ViewBag.Title = "New";
    Layout = "~/Views/Shared/_Layout.cshtml";


<h2>New Customer</h2>

@using(@Html.BeginForm("Create", "Customers"))

    <div class="form-group">
        @Html.LabelFor(m => m.Customer.Name)
        @Html.TextBoxFor(m => m.Customer.Name ,new  @class = "form-control" )
        @Html.ValidationMessageFor(m => m.Customer.Name)
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.Customer.Birthdate)
        @Html.TextBoxFor(m => m.Customer.Birthdate, "0:d MMM yyyy", new  @class = "form-control" )
        @Html.ValidationMessageFor(m => m.Customer.Birthdate)
    </div>
    <div class="checkbox">
        <label>
            @Html.CheckBoxFor(m => m.Customer.IsSubscribedToNewsletter) Subscribed To Newsletter?
        </label>
       
    </div>

    <div class="form-group">
        @Html.LabelFor(m => m.Customer.MemberShipTypeId)
        @Html.DropDownListFor(m => m.Customer.MemberShipTypeId, new SelectList(Model.MembershipTypes, "Id", "Name"), "Select Membership Type" ,new  @class = "form-control" )
        @Html.ValidationMessageFor(m => m.Customer.MemberShipTypeId)
    </div>
    
    @Html.HiddenFor(m => m.Customer.Id);
    @Html.AntiForgeryToken()
    <button type="submit" class="btn btn-primary">
        Submit
    </button>

我在提交表单时检查了网络选项卡,并且正在发出请求并且正在发送数据,但 customer.Id 未设置任何内容,我认为这是错误但不知道如何解决它。这是供参考的图片:

我不知道如何解决这个问题,因为我不明白为什么会这样。我也有一个编辑操作,它工作正常并更新数据库中的数据,但创建不起作用。

PS:我知道有一些措辞相似的问题,但它们并不能解决我的问题,所以请不要将其标记为重复。

【问题讨论】:

【参考方案1】:

它不起作用,因为您将复杂类型模型从视图传递到控制器。在这种情况下,您必须在控制器中指定如何处理此请求。尝试检查您的表单 html 输出,您会注意到每个属性,例如:m.Customer.MemberShipTypeId 呈现为 Customer_MemberShipTypeId 等。 要解决此问题,请更改您的方法以绑定复杂模型的每个前缀。示例:

public ActionResult Create([Bind(Prefix = "Customer")] Customer customer)


试试也改一下

@using (Html.BeginForm("Create", "Customers", FormMethod.Post, new  @class = "form", role = "form" ))


【讨论】:

试过了,但它不起作用。结果还是一样。此外,我也有一个编辑操作,在那里我通过了Customer customer,但它可以工作 你是否请求打控制器方法? 提交表单后 url 会更改为 /customers/create。但是,数据没有保存到数据库,重定向也不起作用。 了解,但在方法的开头放置一个断点以检查您的请求是否命中控制器。 是的,我做到了,是的,它最终进入了调用堆栈【参考方案2】:

您的操作应与表单模型具有相同的输入参数

 public ActionResult Create(NewCustomerViewModel model)

您也可以为 customerId 创建隐藏字段,但创建的意义不大,因为它始终为 0

@Html.HiddenFor(m => m.Customer.Id)

【讨论】:

以上是关于即使发送了请求,ASP.NET MVC 表单数据也没有保存到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 中 RedirectToAction 而不会丢失请求数据

跟我学ASP.NET MVC之十一:URL路由

即使模型无效,ASP.NET MVC“Ajax.BeginForm”也会执行 OnSuccess

从控制器事件(无客户端请求)向视图发送数据 ASP.NET MVC 4

ASP.NET MVC 实现AJAX跨域请求方法《1》

基于ASP.NET MVC 下的Extjs的Combbox加载速率问题,终于解决啦:)