Обязательный валидатор всегда возвращает false - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть модель EF Code First, которую я редактирую через страницу MVC, с определенным полем, которое всегда возвращает false с аннотацией [Required] данных. Если я жестко установлю значение прямо перед проверкой, оно все равно не будет выполнено.

Это для объекта User, который я могу настроить, если я использую имя пользователя или адрес электронной почты в качестве свойства 'username'.

Модель:

public class User {
    [DisplayName("User Id")]
    public int Id { get; set; }

    [Required(ErrorMessage="Username is required")]
    public string Username { get; set; }

    [UIHint("EmailAddress")]
    [Required(ErrorMessage = "Email is required")]
    [EmailAddress]
    public string Email { get; set; }
}

На мой взгляд, я рисую Username редактор, только если он необходим:

@if (@ViewBag.LoginMethod == "username") {
    @Html.LabelFor(m => m.Username)
    @Html.TextBoxFor(m => m.Username, new { autocomplete = "off" })
    @Html.ValidationMessageFor(m => m.Username)
}

@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email, new { autocomplete = "off" })
@Html.ValidationMessageFor(m => m.Email)

Мой контроллер:

[HttpPost]
public ActionResult Create(UserModel viewModel) {
        ViewBag.LoginMethod = this.loginMethod.ToString();

        var user = new User();
        if (this.loginMethod == LoginMethods.Username)
            user.Username = viewModel.User.Username;
        else
            user.Username = viewModel.User.Email;

        user.Email = viewModel.User.Email;
        user.FirstName = viewModel.User.FirstName;
        user.LastName = viewModel.User.LastName;

        user.Username = "TEST";
        if (TryValidateModel(user) == false) {
            this.FlashError("Validation Errors!");
            return View(viewModel);
        }

        throw new Exception("here");
}

Как видите, я устанавливаю свойство User.Username, основываясь на методе входа в систему. Ради тестирования я устанавливаю его на "ТЕСТ" прямо перед проверкой. Проверка «Требуется имя пользователя» возвращает ложь, и я снова оказываюсь в своем представлении. Я никогда не получаю исключение.

Мне удалось заставить его работать правильно, отобразив редактор имени пользователя на странице, несмотря ни на что. Поскольку у меня включена проверка на стороне клиента, я не могу отправить форму без ввода значения, и она работает - даже если значение имени пользователя по-прежнему равно «TEST» после проверки.

Я начинаю думать, что TryValidateModel не правильная функция. Использование ModelState.IsValid дает тот же результат - неверный Обязательный сбой.

1 Ответ

0 голосов
/ 26 ноября 2011

Во-первых, я думаю, что вы можете использовать EditFor сейчас, чтобы избежать создания трио элементов управления каждый раз (метка, текстовое поле, валидатор).

Еще одна вещь, которая меня удивляет, это то, что ваша модель выглядиттипа User (m.Email), но ваше действие принимает UserModel (который содержит User).Я не уверен, почему ваш код все еще работает.Обычно в качестве параметра можно использовать непосредственно пользователя (поэтому вам не нужно копировать значения вручную).

Это нормально, если ModelState.IsValid не работает.Если ваша модель имеет тип User, она попытается проверить все свойства POSTED, независимо от того, находятся ли они в представлении.С другой стороны, TryValidateModel ДОЛЖЕН работать в вашем сценарии.Кажется, там есть дополнительная функция безопасности, которая считает пустыми свойства, для которых не было элемента управления «Редактировать».Обходным путем будет создание собственного пользовательского связывателя модели для объекта User самостоятельно (это не так сложно, вы наследуете IModelBinder, переопределяете BindModel и вызываете базовый метод. После этого, если имя пользователя пустое, вы добавляете «TEST» илиправильное значение. Конечно, вы не можете оставить его пустым).Поиск пользовательских связующих моделей в Asp.net MVC.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...