如何使用字符串值而不是表达式设置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'的参数(您是否缺少 指令还是程序集引用?)
由于一致性,我想使用标记助手。
答案 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>
我希望这会有所帮助。