ASP CORE: @ Html.ValidationMessage миграция в asp-validation-for или аналогичный помощник по тегам - PullRequest
0 голосов
/ 12 мая 2019

Как настроить asp-validation-for со строковым значением, а не с выражением?

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

@Html.ListBox("Privileges", ViewBag.PrivilegesMultiSelectList as MultiSelectList)
@Html.ValidationMessage("Privileges", "")

должно стать

<select multiple="multiple" name="Privileges" asp-items="@ViewBag.PrivilegesMultiSelectList"></select>
<span asp-validation-for="Privileges" class="text-danger"></span>

Но последняя строка недействительна:

Ошибка CS1061 «... Модель» не содержит определения «Привилегии» и не имеет доступного метода расширения «Привилегии», принимающего первуюможет быть найден аргумент типа "..Model" (вам не хватает директивы using или ссылки на сборку?)

Я хочу использовать tag-helper из-за непротиворечивости.

1 Ответ

1 голос
/ 12 мая 2019

asp-validation-for="Privileges" пытается найти свойство Privileges в вашей модели (не ViewBag). Если его не существует, он выдаст вам эту ошибку. Эта строка эквивалентна ValidationMessageFor(), и на самом деле в ядре .net нет эквивалента для ValidationMessage().

Посмотрите на asp-validation-for тег helper , который, как указано, должен совпадать с именем другого taghelper.

Как настроить asp-validation-for со строковым значением, а не с выражением?

Опять же, нет эквивалента для ValidationMessage() в TagHelpers. Так что вы можете просто использовать @Html.ValidationMessage().

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro?view=aspnetcore-2.2

важно понимать, что помощники тегов не заменяют помощники HTML, и для каждого помощника HTML нет помощника по тегам.

Вы также можете написать свой собственный помощник по тегам с помощью ValidationMessage HtmlHelper

Несколько советов от документации относительно ViewBags:

Мы не рекомендуем использовать ViewBag или ViewData с Select Tag Helper. Модель представления более надежна в предоставлении метаданных MVC и, как правило, менее проблематична.

Лучший подход:

Вам нужно будет добавить выбранные привилегии к вашей модели, которую вы хотите вернуть.

public class CustomViewModel {
    [Required]
    public string Privilege { get; set; } // update if you want to return multiple privileges

    public List<SelectListItem> PrivilegesMultiSelectList { get; set; }
}

, а затем используйте это в своем представлении @model CustomViewModel.

Используя asp-for="Privilege" на вашем выборе, оно становится m => m.Privilege.

https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-2.2

Значение атрибута asp-for является особым случаем, и не требует Префикс модели , другие атрибуты Tag Helper делают (например, asp-items)

Вы можете просто написать это так:

<select asp-for="Privilege" asp-items="@Model.PrivilegesMultiSelectList"></select> 
<span asp-validation-for="Privilege" class="text-danger"></span>

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

...