MVC4 编辑发布方法未保存
本文关键字:方法 保存 编辑 布方法 MVC4 | 更新日期: 2023-09-27 18:32:26
我是 asp.net MVC4的新手,我有一个使用SQL Server 2012 EntityFramework(代码优先)的MVC4应用程序。编辑发布方法不会保存数据。在检查ModelState.IsValid时,它返回false,任何人都可以帮助我找到我的代码有什么问题
型
public class Customer
{
[Key]
public int Id { get; set; }
[Required(ErrorMessage="*")]
public string FirstName { get; set; }
[Required(ErrorMessage = "*")]
public string LastName { get; set; }
[Required(ErrorMessage = "*")]
[MaxLength(1, ErrorMessage="Initial only")]
public string MI { get; set; }
[Required(ErrorMessage = "*")]
public string Address { get; set; }
[Required(ErrorMessage = "*")]
public String ContactNo { get; set; }
[Required(ErrorMessage = "*")]
[DataType(DataType.EmailAddress, ErrorMessage = "Invalid Email")]
public string EmailAddress { get; set; }
[Required(ErrorMessage = "*")]
[MaxLength(8, ErrorMessage = "Max of 8")]
[MinLength(5, ErrorMessage = "Min of 5")]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[NotMapped]
public string Password { get; set; }
[Required(ErrorMessage = "*")]
[DataType(DataType.Password)]
[NotMapped]
[Display(Name = "Retype-PW")]
public string RetypePassword { get; set; }
[Required]
[Display(Name = "How much is")]
[NotMapped]
public string Captcha { get; set; }
}
编辑视图
<h2>Edit CUSTOMER</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Customer</legend>
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model=>model.Captcha)
@Html.HiddenFor(model=>model.Password)
@Html.HiddenFor(model=>model.RetypePassword)
<div class="editor-label">
@Html.LabelFor(model => model.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.LastName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.MI)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.MI)
@Html.ValidationMessageFor(model => model.MI)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Address)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Address)
@Html.ValidationMessageFor(model => model.Address)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.ContactNo)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ContactNo)
@Html.ValidationMessageFor(model => model.ContactNo)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.EmailAddress)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.EmailAddress)
@Html.ValidationMessageFor(model => model.EmailAddress)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
编辑控制器方法
public ActionResult Edit(int id = 0)
{
Customer customer = db.Customers.Find(id);
if (customer == null)
{
return HttpNotFound();
}
return View(customer);
}
//
// POST: /Customer/Edit/5
[HttpPost]
public ActionResult Edit(Customer customer)
{
if (ModelState.IsValid)
{
db.Entry(customer).State = EntityState.Modified;
db.SaveChanges();
if (User.IsInRole("Administrator"))
{
return RedirectToAction("Index");
}
else
{
return RedirectToAction("Details");
}
}
return View(customer);
}
感谢您的帮助
@Html.HiddenFor(model=>model.Captcha)
@Html.HiddenFor(model=>model.Password)
@Html.HiddenFor(model=>model.RetypePassword)
这行不安全,有可能同时在控制台中查看内容 密码中的值可能不是好的值 您设置了 8 个字符的限制,但您在 BD 中读取了该值,我希望这个值是 cripted!,您编写的代码超过 8 个字符,该模型无效, 尝试在控制台中读取此冠军的值,并与您的设置进行比较。
您使用相同的模型创建和编辑的问题,对于编辑不是必需的Captha和Pasword,选项是制作其他模型,不需要设置,检查创建或编辑模式是否需要设置,
帮助我找出代码的问题
- 您正在使用脚手架
@Html.ValidationSummary(true)
,其中true
传递hidePropertyErrors
。如果您的编辑表单为模型的每个属性显示编辑器,这很好,但如果没有,您的页面将不会显示阻止成功处理的 ModelState 错误。将true
更改为false
以查看所有错误。 - 您正在使用实体框架模型作为视图模型。
- 你允许大规模分配。
- 您没有使用跨站点请求伪造令牌。
您刚刚遇到了演示为什么应该使用 ViewModel 的主要情况。一种解决方案是删除不希望看到错误的属性的模型错误。
喜欢:
ModelState.Remove("Captcha");
ModelState.Remove("Password");
ModelState.Remove("RetypePassword");
if (ModelState.IsValid)
{
// your code ...
但这会导致您的模型更新为空密码 null 对于您未提供编辑器的属性,您不想这样做,并且无论如何都会失败。因此,您需要加载现有实体并对其进行更新:
ModelState.Remove("Captcha");
ModelState.Remove("Password");
ModelState.Remove("RetypePassword");
if (ModelState.IsValid)
{
var existingCustomer = db.Customers.First(c => c.ID == customer.ID);
// Update properties of attached entity
existingCustomer.FirstName = customer.FirstName;
existingCustomer.LastName = customer.LastName;
// and so on...
要避免大部分这种笨拙,只需定义一个 ViewModel:
public class EditCustomerModel
{
[Required(ErrorMessage="*")]
public string FirstName { get; set; }
[Required(ErrorMessage="*")]
public string LastName { get; set; }
// and so on...
}
然后在您的操作方法中将如下所示:
public ActionResult Edit(EditCustomerModel customer)
{
if (ModelState.IsValid)
{
var existingCustomer = db.Customers.First(c => c.ID == customer.ID);
// Update properties of attached entity
existingCustomer.FirstName = customer.FirstName;
existingCustomer.LastName = customer.LastName;
db.SaveChanges();
return RedirectToAction(...);
}
return View();
}
我使用了 CodeCaster 第二个建议,但它不起作用,但是当我在我的视图上放置 3 个未映射字段(验证码、密码、重新输入密码)的隐藏输入并分配默认值时,它现在可以工作了。
<input type="hidden" id="Captcha" name="Captcha" value="Captcha" />
<input type="hidden" id="Password" name="Password" value="Password" />
<input type="hidden" id="RetypePassword" name="RetypePassword" value="RetypePassword" />