0

昨日からこの問題があります。私の User モデルには、「ConfirmPassword 」という[NotMapped]があります。データベースには保存しませんが、新しいユーザーのデータ入力を常に検証するために作成フォームで使用しています。

以来、それは大丈夫です。問題は私の [HttpPost] Edit アクションにあります。タイプなしで一部のユーザーのデータを編集し、パスワードを確認できるはずです。パスワードを変更したい場合は、古いパスワードを確認し、新しいパスワードを通知する方法として、Password と ConfirmPassword の両方を使用します。しかし、そうでない場合は、空白のままにします。

ModelState.IsValid() 条件を渡すことができるように、以下のコードを既に使用しましたが、機能しました。

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

しかし、db.SaveChanges() の直前に、User ユーザー ビュー モデルが考慮されるため、両方のプロパティが空であり、次のようになりました。

Property: ConfirmPassword Error: The field ConfirmPassword is invalid.

問題は、オブジェクトを更新するときに必要なモデルの検証をスキップするにはどうすればよいかということです。

ValidationAttributeおよび DataAnnotationsModelValidatorを拡張するクラスを使用したカスタム ModelValidations については既に読みましたが、正しく行っていません。

何か案が?UserId プロパティが null かどうかを確認するカスタム モデル検証を作成するにはどうすればよいですか。作成または編集アクションを実行しているかどうかを確認するには、これは良い方法です。

ありがとう、パウロ

4

1 に答える 1

0

ドメイン オブジェクトを ViewModel として使用すると、スケーラビリティが低下します。ビューに固有の別のビューモデルを選択します。データを保存する必要がある場合は、ViewModel を Domain モデルにマップして保存します。あなたの特定のケースでは、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 に答える