即使发送了请求,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“Ajax.BeginForm”也会执行 OnSuccess