开发者

Needing to copy properties before validation

开发者 https://www.devze.com 2023-01-01 11:06 出处:网络
I have a fairly complex model needing to be validated, the problem is that this model is used on two different places, one where you register your customerand one where you simply add addresses. Some

I have a fairly complex model needing to be validated, the problem is that this model is used on two different places, one where you register your customer and one where you simply add addresses. Some fields on the address are simply not visible on the register customer form. So when i check if ModelState.IsValid i get false of course since eg. the name is not entered on the billing address, but it is on the customer. That is why i want to before validation occurs, copy a couple of fields to the model, and then validate. I am somewhat lost though and i need help.

My action looks something like this:

public ActionResult Register(WebCustomer customer) 
{
     customer.CopyP开发者_如何转开发roperties();
     if(TryUpdateModel(customer)) 
     {
       ...
     }
     ...

But it always returns false, and ModelState.IsValid continues to be false.


I think that the best approach in this situation, is to write CustomModelBinder, and apply it to your action parameter

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

This CustomModelBinder should take care of copying fields, and because its applied to action parameter it will be used only in this action.


Binder is working on form values. So, your ModelState's always throw an error. you have to check your properties in your entity or second option's write your own model binder. eg.

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

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


I solved it a bit diffferently, not sure if it is the best way but:

First i made an extension method for the ModelStateDictionary

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

then i did the following in my action:

ModelState.ResetErrors();
customer.CopyProperties();
ValidateModel(customer);
0

精彩评论

暂无评论...
验证码 换一张
取 消