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);
        }

感谢您的帮助

MVC4 编辑发布方法未保存

@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" />