2

在我MVC3應用程序,我有模型(刪除不重要屬性):驗證屬性被觸發兩次

public class AccountViewModel 
{ 
    [StringLength(65)] 
    public string Property1 { get; set; } 

    [StringLength(65)] 
    public string Property2 { get; set; } 
} 

問題是,當一個動作submited調用兩次驗證屬性,我可以得到4個錯誤總之,而不是2:

'Property1' length must be less than 65 characters 
'Property1' length must be less than 65 characters 
'Property2' length must be less than 65 characters 
'Property2' length must be less than 65 characters 

我不使用驗證方法在我的控制器的代碼。問題也出現在我的自定義屬性中,但它不會在Required屬性中出現。此外,我還要注意定製的該構造函數的屬性也被稱爲兩次

我的行動

[HttpPost] 
public ActionResult CreateOrEdit(AccountViewModel model) { 

    if (!ModelState.IsValid) { 
     return View("Edit", model); 
    } 

    try { 
     _accountService.InsertOrUpdate(model); 

    } 
    catch (Exception ee) { 
     ModelState.AddModelError("", ee.Message); 
     return View("Edit", model); 
    } 

    return RedirectToAction("Index"); 
} 

上查看我使用使我的錯誤:

@{ 
    var errors = ViewData.ModelState.Errors(); 
    <div class="alert alert-block alert-error @(errors.Count == 0 ? "hide" : "")" > 
    <h4 class="alert-heading"> You got an error!</h4> 
    <ul> 
     @foreach (var error in errors) { 
      <li>@error</li> 
     } 
    </ul> 
    </div> 
} 

我加倍再檢查一次該ViewData.ModelState已經包含錯誤兩次。

+0

嗯,你有屬性聲明中的55和錯誤消息中的65值 – 2012-04-12 18:36:49

+0

你可以發佈操作嗎?另外,確認你沒有在視圖中調用兩次'ValidationSummary'。 – 2012-04-12 18:37:58

+0

更新了行動代碼@Steve Mallory – bogert 2012-04-12 18:40:18

回答

2

問題在於整合Ninject。如果您使用Ninject.MVC包(我用的第3版)它註冊了自己的ModelValidationProvider而初始化,並刪除舊的:

Ninject.Web.Mvc.MvcModule

this.Kernel.Bind<ModelValidatorProvider>().To<NinjectDataAnnotationsModelValidatorProvider>(); 

Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin

public void Start() 
{ 
    ModelValidatorProviders.Providers.Remove(ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().Single()); 
    DependencyResolver.SetResolver(this.CreateDependencyResolver()); 
    RemoveDefaultAttributeFilterProvider(); 
} 

因此,而不是創造我自己的實施發展規劃研究所endencyResolver(Ninject內核包裝)我跟着這tutorial 或 你應該刪除Ninject.MVC包並從bin文件夾中刪除它的二進制文件。

+0

如果使用正確,Ninject擴展不會導致該問題。如果你不知道你如何設置註冊,那麼不可能給你一個答案。 – 2012-04-13 23:14:51

+0

你說得對,我用它不正確,現在當它正確安裝 - 一切都很好@RemoGloor – bogert 2012-04-16 10:28:50

+2

@bogert,「_when它正確安裝正確」是什麼意思?你能解釋一下嗎? – 2014-07-01 12:13:20