1

検証が必要なかなり複雑なモデルがあります。問題は、このモデルが 2 つの異なる場所で使用されていることです。1 つは顧客を登録する場所、もう 1 つは単に住所を追加する場所です。住所の一部のフィールドは、顧客登録フォームには表示されません。したがって、ModelState.IsValid かどうかを確認すると、もちろん false になります。名前は請求先住所には入力されませんが、顧客には入力されます。そのため、検証が行われる前に、いくつかのフィールドをモデルにコピーしてから検証したいと考えています。私はやや迷っていますが、助けが必要です。

私のアクションは次のようになります。

public ActionResult Register(WebCustomer customer) 
{
     customer.CopyProperties();
     if(TryUpdateModel(customer)) 
     {
       ...
     }
     ...

ただし、常に false を返し、ModelState.IsValid は false のままです。

4

3 に答える 3

3

この状況での最善のアプローチは、CustomModelBinder を記述し、それをアクション パラメーターに適用することだと思います

public ActionResult Register([ModelBinder(typeof(WebCustomerRegisterBinder))]WebCustomer customer)  
{
  if(TryUpdateModel(customer))  
  { 
    ... 
  } 
  ...
}

この CustomModelBinder はフィールドのコピーを処理する必要があり、アクション パラメーターに適用されるため、このアクションでのみ使用されます。

于 2010-05-25T08:10:56.397 に答える
1

Binder はフォームの値に取り組んでいます。したがって、ModelState は常にエラーをスローします。エンティティでプロパティを確認するか、2 番目のオプションで独自のモデル バインダーを作成する必要があります。例えば。

public class Customer
{
    public bool IsValid()
    {
        //TODO: check properties.
    }
}

public ActionResult Register(WebCustomer customer) 
{
    customer.CopyProperties();
    TryUpdateModel(customer);
    if (customer.IsValid())
    {
        ...
    }
    ...
于 2010-05-25T09:33:50.457 に答える
1

私はそれを少し異なる方法で解決しましたが、それが最善の方法であるかどうかはわかりませんが、

まず、ModelStateDictionary の拡張メソッドを作成しました

public static void ResetErrors(this ModelStateDictionary modelState)
{
     foreach (var error in modelState.Values.Select(m => m.Errors))
 {
    error.Clear();
 }
}

それから私は私の行動で次のことをしました:

ModelState.ResetErrors();
customer.CopyProperties();
ValidateModel(customer);
于 2010-05-25T09:34:01.453 に答える