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);