ModelState.IsValid does not exclude required property

I am currently experiencing a similar issue with MVC3.

Despite [Bind(Exclude = "Password")] in my Action, ModelState.IsValid still returns false.

I noticed that TryUpdateModel(user, null, null, new string[]{"Password"}); was successfully updating the model; however still returning false. I then found out (somewhere on stackoverflow, apologies for not having the link) that TryUpdateModel actually returns ModelState.IsValid.

Thus, the issue is not with TryUpdateModel, but with ModelState.IsValid.

NB: this also means that you do not need to verify this twice... you can use this code:

if (!TryUpdateModel(user, null, null, new string[]{"Password"}))
    return PartialView(user);

The issue thus appears as if ModelState is still validating properties that have been excluded from your FormCollection.

I was able to overcome this by removing the field from ModelState prior to calling TryUpdateModel:

ModelState.Remove("Password");

Note that TryUpdateModel still requires the list of properties to exclude from the update as per the above code.


I had success using the following method within ASP .NET MVC 2

TryUpdateModel(user);
ModelState.Remove("Password");
if (!ModelState.IsValid) return PartialView(user);

To keep the TryUpdate from binding to certain model properties you can create an inclusion template such as the one below:

public interface IUserValidateBindable
{
    string UserId { get; set; }
}

public class User : IUserValidateBindable
{
    [Required]
    public string UserId { get; set; }
    [Required]
    public string Password { get; set; }
}

The update the TryUpodateModel call as follows:

TryUpdateModel<IUserValidateBindable>(user);

Tags:

Asp.Net Mvc