Проверка Asp.Net Core MVC RC-1 не отображается, когда JavaScript отключен

У меня есть форма, которая должна работать даже при отключенном JavaScript, и мне нужно проверить эту форму, у меня есть помощник по тегу для нее, например:

<span asp-validation-for="ContactName" class="text-danger" />

И в моем контроллере:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(ContactViewModel contact)
    {
        if (!ModelState.IsValid)
        {
            return View(contact);
        }
         // do something
     }

Вот моя модель просмотра:

public class ContactViewModel
{
    public int ContactId { get; set; }
    public DateTime ContactDate { get; set; }

    [Required(ErrorMessage ="پر کردن این فیلد الزامی میباشد.")]
    [MaxLength(100, ErrorMessage ="حداکثر تعداد کراکتر برای این فیلد نمیتواند بیشتر از صد باشد.")]
    public string ContactName { get; set; }

    [Required(ErrorMessage = "پر کردن این فیلد الزامی میباشد.")]
    [EmailAddress(ErrorMessage ="لطفا یک ایمیل معتبر وارد کنید.")]
    [MaxLength(100, ErrorMessage = "حداکثر تعداد کراکتر برای این فیلد نمیتواند بیشتر از صد باشد.")]

    public string ContactEmail { get; set; }

    [Required(ErrorMessage = "پر کردن این فیلد الزامی میباشد.")]
    [MaxLength(4000, ErrorMessage = "حداکثر تعداد کراکتر برای این فیلد نمیتواند بیشتر از چهار هزار باشد.")]
    public string ContactBody { get; set; }

    [Range(1000000000, double.MaxValue, ErrorMessage = "لطفا یک شماره تلفن معتبر وارد نمایید.")]
    public string ContactPhone { get; set; }
}

Когда я использую помощник тега для проверки, сообщение проверки не отображается под текстовым полем, если проверка не выполняется, но когда я использую старые помощники Html, например:

@Html.ValidationMessageFor(model => model.ContactName)

Это работает, я хотел знать, это задумано или это ошибка? Также стоит отметить, что помощник тега сводки проверки работает, если я установил его asp-validation-summary="ValidationSummary.All", но мне нужно сообщение проверки для отдельного текстового поля в форме, хотя?


person Deckard    schedule 26.03.2016    source источник
comment
Почему вы возвращаете представление в случае недопустимой модели и Json, когда модель действительна? Это странно ! Как вы вызываете этот метод со стороны клиента?   -  person agua from mars    schedule 26.03.2016
comment
К текущей проблеме это не относится, вопрос редактировал.   -  person Deckard    schedule 27.03.2016


Ответы (2)


Я понял, что

<span asp-validation-for="Model.Name" class="text-danger"/>

не будет отображаться, если вы не добавите на страницу jquery-validation js. В MVC Core вам нужно будет добавить его, вызвав

   @section Scripts {
     @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    }

Частичное представление _validationScriptsPartial имеет эту разметку

<environment names="Development">
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>

person Tonto    schedule 12.09.2016

проверка на стороне клиента не может работать без javascript, вы также должны выполнить проверку на стороне сервера, чтобы она работала с javascript или без него

то есть на сервере вы проверяете, действительна ли модель, и если нет, верните пользователя обратно в то же представление

if (!ModelState.IsValid)
 {
     return View(model);
}
person Joe Audette    schedule 26.03.2016
comment
Извините за то, что не включил мой код контроллера в свой вопрос, я уже сделал это, я знаю разницу между ними, но вспомогательная версия html работает для обоих (на стороне клиента и на стороне сервера), а вспомогательная функция тегов - нет. - person Deckard; 26.03.2016
comment
хорошо, но покажите свою модель, есть ли у нее какие-либо фактические атрибуты проверки? Также вы возвращаете json, а не представление, которое кажется странным, поскольку вы сказали, что javascript отсутствует. Если вы возвращаете json, как правило, вы возвращаете его на основе вызова ajax javascript на стороне клиента на сервер, в этом случае вам придется использовать javascript на стороне клиента для ответа на результат json, вы не можете просто иногда вернуть представление и в других случаях возвращайте json, что кажется странным - person Joe Audette; 26.03.2016
comment
Я отредактировал вопрос с моделью представления, и это не имеет ничего общего с возвратом json, если проверка не удалась, я возвращаю представление, если не json, у меня есть некоторая логика для использования ajax, если JavaScript был включен, и использовать обычный пост, если он был отключен, но это не имеет значения, то же самое произойдет, если я верну нормальное представление без какого-либо json или чего-то еще, я отредактировал вопрос, проверка не работает с текущим кодом в действии контроллера. - person Deckard; 27.03.2016
comment
Вы прошли через код, чтобы узнать, в каком состоянии находится модель при обратной передаче? - person Joe Audette; 27.03.2016
comment
Подобный код работает для меня так, как ожидалось, поэтому в вашем коде должно быть что-то не так. - person Joe Audette; 27.03.2016
comment
Вы делали это с отключенным JavaScript? не работая, я имею в виду, что проверка завершилась неудачно, состояние модели недействительно и форма не отправляется, но ошибки проверки не отображаются, я думаю, мне придется пока придерживаться помощников html, в любом случае спасибо. - person Deckard; 29.03.2016
comment
да, например, если я использую стандартный новый шаблон проекта с отдельными пользователями, то есть с удостоверением, страница регистрации показывает ошибки проверки, даже если я использую Firefox с включенным плагином noscript, так что ни один js не может выполняться, я все еще вижу сообщения проверки, так же, как и в моих собственных проектах, он работает без включенного js. Я не могу не думать, что те вещи, которые вы говорите, не имеют отношения к проблеме, действительно актуальны, вы должны использовать разные имена методов для сообщений ajax и обычных сообщений. - person Joe Audette; 29.03.2016