3

わかりました、私はここでウィットエンドに近づいています。ビューモデルを備えたシンプルなMVC3アプリケーションがあります

ViewModel

    public class TicketViewModel {
    public Ticket Ticket { get; set; }

    [DisplayName("Name")]
    [Required(ErrorMessage = "Requestor's name is required.")]
    public string Name { get; set; } }

コントローラ

    [HttpPost]
    public ActionResult Create(TicketViewModel vm)
    {
        if(ModelState.IsValid) {

            TempData["message"] = "Your ticket has been submitted.";
            TempData["message-class"] = "success";

            return RedirectToAction("Index");
        }

        TempData["message-class"] = "error";

        return View("Index", vm);
    }

何らかの理由で、ModelState.IsValidは常にtrueとして実行されています。名前を空白のままにしても。モデル/ビューモデルがまったく検証されていないようです。これは他のアプリケーションでも機能するので、何かを接続していないと確信しています。今のところ問題はないと思いますが、すべての検証JavaScriptも含まれています。

更新 興味深いことに、@ Html.TextBoxFor()によって生成されているhtmlタグには、data-val属性とdata-val-required属性が含まれていません。

意見

@model MyApp.ViewModels.TicketViewModel

@{
    ViewBag.Title = "Tickets";
}

<div id="main-content">
    <section class="large">
      <div class="section">
        <div class="section-header">Submit Ticket</div>
        <div class="section-content">
          <div class="message"></div>

          @using( Html.BeginForm("Create", "Home", FormMethod.Post) ) {
            <h2>User Information</h2>
            <dl>
              <dt>@Html.LabelFor( m => m.Name)</dt>
              <dd>
                @Html.TextBoxFor( m => m.Name)
                @Html.ValidationMessageFor( m => m.Name)
              </dd>

              <dt></dt>
              <dd><button>Submit</button></dd>
            </dl>
          }
        </div>
      </div>
    </section>
</div>

更新II

さて、これは興味深いです。新しいアプリを作成し、基本的なコードで動作するようにしました。次に、DIコードをglobal.asax.csに追加すると、検証が機能しなくなりました。具体的には、

    public void SetupDependencyInjection() {
        _kernel = new StandardKernel();
        RegisterServices(_kernel);
        DependencyResolver.SetResolver(new NinjectDependencyResolver(_kernel));
    }

Application_Start()から呼び出します

    protected void Application_Start()
    {
        SetupDependencyInjection();

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

SetupDependencyInjection()を削除すると、検証が機能し始めます。明確にするために、DIはうまく機能しますが、検証を無効にするようです。これは、MVC3ツールの更新前はうまく機能していました。

4

4 に答える 4

3

私は解決策を見つけることができました。nugetを介してNinjectをインストールすると、構成が少し異なるようです。App_Startフォルダーからアプリケーションを構成します。基本的に、global.asaxからのNinject-Fuの呼び出しを2倍にしました。これにより、アプリケーションの他の部分は機能していましたが、奇妙な検証の問題が発生しました。

Ninject-MVC3アプリケーションのセットアップ

于 2011-05-19T23:00:50.163 に答える
1

デフォルトのモデルバインダー(DI付き)以外のものを使用している可能性がありますか?デフォルトのモデルバインダーは、バインド時にオブジェクトを検証すると確信しています。デフォルトのものを使用していない場合、同じ動作が発生しない可能性があります。

于 2011-05-19T21:37:50.813 に答える
0

使ってみてください

@Html.EditorFor(model => model.Name)

data-これで属性が正しく適用されます

于 2011-05-19T20:54:56.473 に答える
0

Ninject.MvcをDependencyResolverと一緒に使用しても同じエラーが発生しました。その理由は、BootstrapperオブジェクトとDependencyResolverオブジェクトごとに新しいIKernelインスタンスを作成したためです。

//Application_Start()
DependencyResolver.SetResolver(new NinjectDependencyResolver(NinjectBooster.CreateKernel()));

この問題を解決するために、次のように、同じキャッシュインスタンスを使用するようにコードを変更しました。

//Application_Start()
DependencyResolver.SetResolver(new NinjectDependencyResolver(NinjectBooster.GetKernel()));
...

//NinjectMVC.cs
private static IKernel _kernel;

/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
public static IKernel GetKernel()
{
   if (null == _kernel)
   {
       _kernel = new StandardKernel();
       RegisterServices(_kernel);
   }
        return _kernel;
}
于 2011-09-12T09:14:33.790 に答える