Model.IsValid всегда возвращает true - PullRequest
3 голосов
/ 19 мая 2011

Хорошо, я почти сошел с ума.У меня есть простое приложение 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 генерируются @Html.TextBoxFor () НЕ включает атрибуты 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 ]

3 голосов
/ 20 мая 2011

Мне удалось найти решение.Кажется, что когда вы устанавливаете Ninject через nuget, конфигурация немного отличается.Он настраивает ваше приложение из папки App_Start.По сути, я удваивался, когда мне звонил Ninject-Fu из global.asax.Это закончилось тем, что вызвало странные проблемы с проверкой, хотя другие части приложения работали.

Ninject - Настройка приложения MVC3

1 голос
/ 20 мая 2011

Возможно, вы используете что-то другое, чем связующее по умолчанию для модели (с DI)?Я уверен, что связыватель модели по умолчанию будет проверять объект при связывании.Если вы не используете по умолчанию, вы можете не иметь такого поведения.

0 голосов
/ 12 сентября 2011

Я получил ту же ошибку, используя Ninject.Mvc вместе с DependencyResolver. Причина в том, что я создал новый экземпляр IKernel для каждого объекта Bootstrapper и DependencyResolver.

//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;
}
0 голосов
/ 20 мая 2011

Попробуйте использовать

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

Это должно применить атрибуты data- правильно

...