【问题标题】:ASP CORE: @Html.ValidationMessage migration to asp-validation-for or similar tag helperASP CORE:@Html.ValidationMessage 迁移到 asp-validation-for 或类似的标签助手
【发布时间】:2019-05-12 14:03:08
【问题描述】:

如何使用字符串值而不是表达式设置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' 不包含 'Privileges' 的定义 并且没有可访问的扩展方法“权限”接受第一个 可以找到“..Model”类型的参数(您是否缺少使用 指令还是程序集引用?)

由于一致性,我想继续使用 tag-helper。

【问题讨论】:

    标签: asp.net asp.net-core asp.net-core-2.2 asp.net-core-tag-helpers


    【解决方案1】:

    asp-validation-for="Privileges" 正在尝试在您的模型(而不是 ViewBag)中查找 Privileges 属性。如果它不存在,它会给你那个错误。该行相当于ValidationMessageFor(),并且afaik 在.net 核心中没有ValidationMessage() 的等价物。

    查看 asp-validation-for tag helper,如上所述,它应该与另一个 taghelper 的名称一致。

    如何使用字符串值而不是表达式设置asp-validation-for

    同样,在 TagHelpers 中没有 ValidationMessage() 的等价物。所以你可以使用@Html.ValidationMessage()

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

    重要的是要认识到 Tag Helper 不会取代 HTML Helper,并且每个 HTML Helper 都没有一个 Tag Helper。

    您也可以使用 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 =&gt; 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>
    

    我希望这会有所帮助。

    【讨论】:

    • 谢谢。当然,我会像往常一样“稍后”尝试迁移到属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多