2010-07-02 54 views
7

我試圖排除一個必需的屬性(密碼),所以模型狀態不驗證該屬性,但由於某種原因,即使我試圖排除它仍然驗證。ModelState.IsValid不排除必需的屬性

控制器:

[Authorize, AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult _Edit(int id, [Bind(Exclude = "Password")]FormCollection collection) 
    { 
     var user = Proxy.GetUser(id); 

     TryUpdateModel(user, null, null, new[]{"Password"}); 

     if(!ModelState.IsValid) 
      return PartialView(user); 

     Proxy.UpdateUser(user); 
    } 

查看:

... 
    <tr> 
     <td class="label"> 
      <label class="row_description" for="Password"><%= S._("Password")%></label> 
     </td> 
     <td> 
      <%= Html.Password("Password", null, new { @class = "row_input" })%> 
      <%= Html.ValidationMessage("Password", "*")%> 
     </td> 
    </tr> 

用戶(使用dataannotation):使用VS2008

[Required] 
public string Password { get; set; } 

IM,MVC2,火狐

也許我只是累了並且可以'沒有看到它。任何幫助表示讚賞

回答

14

我目前遇到類似的問題與MVC3。

儘管[Bind(Exclude = "Password")]在我的操作中,ModelState.IsValid仍然返回false。

我注意到TryUpdateModel(user, null, null, new string[]{"Password"});正在成功更新模型;但仍然返回錯誤。然後我發現(在stackoverflow的某處,對於沒有鏈接的道歉)TryUpdateModel實際上返回ModelState.IsValid

因此,問題不在於TryUpdateModel,而是在ModelState.IsValid

注意:這也意味着你不需要驗證這兩次......你可以使用此代碼:

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

因此出現問題,因爲,如果ModelState中仍確認已排除特性你的FormCollection

我能夠從ModelState去除場呼籲TryUpdateModel之前解決此問題:

ModelState.Remove("Password"); 

注意TryUpdateModel仍然需要屬性的列表,從更新按照上面的代碼中排除。

+0

我也在爲此而苦苦掙扎。執行ModelState.Remove時,顯然應該被排除,這似乎很棘手。任何人都可以解釋爲什麼MC3 validaton忽略綁定(排除=)? – automagic 2011-05-13 17:13:35

+0

@James:我同意,TryUpdateModel排除了excludeProperty中列出的屬性,但IsValid並不排除在Bind(排除)(或excludeProperty)中列出的屬性。 – 2011-05-14 09:14:25

+0

我想我找到了答案:http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html – 2011-05-15 06:24:54

0

也許你應該更換

TryUpdateModel(user, null, null, new[]{"Password"}); 

TryUpdateModel(user, null, null, new string[] {"Password"}); 

,因爲它可能會造成混亂,其過載TryUpdateModel使用。 只是說...

+0

THX的響應,但我認爲我的問題與我使用相同的模型進行創建和編輯有關。我想在創建時需要密碼,但在編輯時不需要密碼。白色/黑色列表顯然與modelstate無效有關:D – larole 2010-07-05 07:52:40

3

我在ASP中使用以下方法成功了。NET MVC 2

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

要綁定到特定模型的屬性保持TryUpdate您可以創建一個包含模板,如下面的一個:

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

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

的更新TryUpodateModel電話如下:

TryUpdateModel<IUserValidateBindable>(user); 
0

我用成功[Bind(Exclude = "Property")]ModelState.Remove("Property")在一起,它的工作就像魅力。

-2

好像我回復得太晚了,但我也面臨同樣的問題。

檢查您的ModelState.Keys集合。鍵可能是modelObjectName.Password的形式,其餘的模型屬性也是如此。

所以在這種情況下ModelState.Remove("Password")將無法​​正常工作。你應該嘗試ModelState.Remove("modelObjectName.Password")

希望這會解決一個人的問題:)

0

你可以使用一個擴展方法,像這樣:

public static bool IsValidExclude(this ModelStateDictionary modelState, params string[] exclude) 
{ 
    foreach (var key in exclude) 
    { 
     if (modelState.ContainsKey(key)) 
      modelState.Remove(key); 
    } 

    return modelState.All(m => m.Value.Errors.Count == 0); 
} 

然後,只需撥打:

var result = ModelState.IsValidExclude("Password");