【问题标题】:Model.IsValid always returning trueModel.IsValid 总是返回 true
【发布时间】:2011-05-19 19:30:01
【问题描述】:

好的,我快到这里了。我有一个带有视图模型的简单 MVC3 应用程序

视图模型

    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 工具更新之前运行良好。

【问题讨论】:

  • 一切看起来都很好。问题应该出在其他地方。你确定Create 动作被击中并且vm.Name 内部为空或空,尽管ModelState.IsValid = true?还有vm != null?因为如果它是 null 模型状态将是有效的。
  • 当你使用ModelState.IsValid时,你肯定必须使用TryValidateModel(vm);
  • 我设置了一个断点,可以看到我在创建操作中。 vm 不为空,但其中的所有属性都为空。这应该会导致 IsValid 为假。
  • BuildStarted:我很确定 ModelState.IsValid 会运行验证。反正应该是。刚刚检查过这也返回 True
  • @jdiaz ModelState.IsValid 不执行任何验证。它只是检查是否注册了任何模型错误。

标签: validation asp.net-mvc-3 ninject-2


【解决方案1】:

我找到了解决方案。似乎当您通过 nuget 安装 Ninject 时,配置有点不同。它从 App_Start 文件夹配置您的应用程序。基本上,我在从 global.asax 调用我的 Ninject-Fu 时加倍努力。这最终导致了奇怪的验证问题,尽管应用程序的其他部分正在运行。

Ninject - Setting up an MVC3 application

【讨论】:

  • 花了很多谷歌搜索,但这个小宝石救了我。
【解决方案2】:

您是否正在使用默认模型绑定器(使用 DI)以外的其他东西?我很确定默认模型绑定器将在绑定时验证对象。如果您不使用默认设置,您可能不会遇到相同的行为。

【讨论】:

    【解决方案3】:

    尝试使用

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

    这应该正确应用data- 属性

    【讨论】:

      【解决方案4】:

      我在使用 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-06
        • 2017-05-10
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多