3

私のMVC3アプリケーションでは、モデルを持っています(重要なプロパティは削除されていません):

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

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

問題は、アクションが送信された検証属性が 2 回呼び出された場合で、要約すると 2 つではなく 4 つのエラーが発生する可能性があります。

'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

コントローラーのコードで Validate メソッドを使用していません。この問題はカスタム属性でも発生しますが、必須属性では発生しません。また、カスタム属性の ctor も 2 回呼び出されることに注意する必要があります。

私の行動

[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 に既に 2 回エラーが含まれていることをもう一度再確認します。

4

2 に答える 2

3

問題は 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();
}

したがって、IDependencyResolver ( Ninject Kernel wrapper ) の独自の実装を作成するのではなく、このチュートリアルに従う か、Ninject.MVC パッケージを削除してそのバイナリを bin フォルダーから削除する必要があります。

于 2012-04-13T07:59:27.493 に答える