0

我从昨天开始就有这个问题。在我的用户模型中,我有一个名为“ ConfirmPassword ”的[NotMapped]。我没有将它保存在数据库中,但我总是在我的 Create 表单中使用它来验证新用户的数据输入。

从那以后,没关系。问题出在我的 [HttpPost] 编辑操作上。我应该能够在没有输入的情况下编辑一些用户的数据并确认密码。如果我想更改密码,我同时使用 Password 和 ConfirmPassword 作为确认旧密码并通知新密码的一种方式。但是,如果我不这样做,我会将它们留空。

我已经使用下面的代码来传递 ModelState.IsValid() 条件并且它起作用了:

ModelState["Password"].Errors.Clear();
ModelState["ConfirmPassword"].Errors.Clear();

但是,就在 db.SaveChanges() 之前,考虑到 User 用户视图模型,它的两个属性都是空的,我得到了:

Property: ConfirmPassword Error: The field ConfirmPassword is invalid.

问题是:当我想更新对象时,如何跳过所需的模型验证?

我已经阅读了自定义 ModelValidations 以及扩展ValidationAttributeDataAnnotationsModelValidator的类,但我做得不对。

任何的想法?我如何创建一个自定义模型验证来检查 UserId 属性是否为空。这是检查我是否处于创建或编辑操作的好方法。

谢谢,保罗

4

1 回答 1

0

使用域对象作为您的 ViewModel 将导致您的可伸缩性降低。我会选择特定于视图的单独视图模型。当我必须保存数据时,我将 ViewModel 映射到域模型并保存。在您的具体情况下,我将创建 2 个 ViewModel

public class CustomerViewModel
{
  public string FirstName { set;get;}
  public string LastName { set;get;}
}

我将拥有另一个ViewModel继承上述类的Create视图

public class CustomerCreateViewModel :CustomerViewModel
{
   [Required]
   public string Password { set;get;}

   [Required]
   public string ConfirmPassword { set;get;}
}

现在在我的 Get 操作中,我使用了这个 ViewModel

public ActionResult Create()
{
  var vm=new CustomerCreateViewModel();
  return View(vm);
}

当然我的 View( create.cshtml) 现在绑定到这个 ViewModel

@model CustomerCreateViewModel
<h2>Create Csustomer</h2/>
//Other form stuff

同样对于我的Edit行动,

public ActionResult Edit(int id)
{
  var vm=new CustomerViewModel();
  var domainCustomer=repo.GetCustomerFromID(id);
  if(domainCustomer!=null)
  {
      //This manual mapping can be replaced by AutoMapper.
      vm.FirstName=domainCustomer.FirstName;
      vm.LastName=domainCustomer.LastName;
  }
  return View(vm);
}

此视图绑定到 CustomerViewModel

@model CustomerViewModel
<h2>Edit Info of @Model.FirstName</h2>
//Other form stuff

在您的POST操作中,将其映射回域对象并保存

[HttpPost]
public ActionResult Create(CustomerCreateViewModel model)
{
  if(ModelState.IsValid)
  {
      var domainCust=new Customer();
      domainCust.FirstName=model.FirstName;
      repo.InsertCustomer(domainCust);
      //Redirect if success (to follow PRG pattern)
  }
  return View(model);
} 

您可以考虑使用 AutoMapper 库来为您完成,而不是自己编写映射。

于 2012-08-09T13:18:30.993 回答