ASP核心:@ Html.ValidationMessage迁移到asp-validation-for或类似的标记助手

时间:2019-05-12 14:03:08

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

如何使用字符串值而不是表达式设置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'的参数(您是否缺少   指令还是程序集引用?)

由于一致性,我想使用标记助手。

1 个答案:

答案 0 :(得分:1)

asp-validation-for="Privileges"试图在模型(而非ViewBag)中寻找Privileges属性。如果不存在,它将给您该错误。该行等效于ValidationMessageFor(),而afaik在.net核心中没有等效于ValidationMessage()

看看tag helper的asp-validation-,它应该与另一个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 => 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>

我希望这会有所帮助。