我正在使用ASP.NET Core v3.1实现表单。
我在Razor页面上有一个下拉代码,如下所示:
<div class="form-group">
<label asp-for="MySelectedItem" class="m-b-none"></label>
<help-text asp-for="MySelectedItem"></help-text>
<div class="input-group">
<select asp-for="MySelectedItem" asp-items="@Model.MyItems" class="form-control"></select>
<partial name="_ValidationIcon" />
</div>
<span asp-validation-for="MySelectedItem" class="validation-message"></span>
</div>
在我的代码后面,我包含一个验证规则,以确保必须选择一个有效的选项。这样可以很好地呈现:
现在,我想将其通用化为ViewComponent,因此我不需要在下拉菜单中随时粘贴这些多余的代码。这是我的实现:
public class DropdownViewComponent : ViewComponent
{
public IEnumerable<SelectListItem> Items { get; set; }
public ModelExpression SelectedItem { get; set; }
public async Task<IViewComponentResult> InvokeAsync(ModelExpression selectedItem, IEnumerable<SelectListItem> items)
{
Items = items;
SelectedItem = selectedItem;
return View(this);
}
}
/ Dropdown / Default.cshtml
@model Web.ViewComponents.DropdownViewComponent
<div class="form-group">
<label asp-for="SelectedItem" class="m-b-none"></label>
<help-text asp-for="SelectedItem"></help-text>
<div class="input-group">
<select asp-for="SelectedItem" asp-items="@Model.Items" class="form-control"></select>
<partial name="_ValidationIcon" />
</div>
<span asp-validation-for="SelectedItem" class="validation-message"></span>
</div>
用法:
<vc:dropdown selected-item="MySelectedItem" items="Model.MyItems"></vc:dropdown>
此代码呈现下拉列表,但是呈现的HTML中缺少验证属性。为什么?
我也不确定如何从传递给视图组件的模型表达式中获取DisplayName。
我哪里出错了?
谢谢
不幸的是,我不认为这很容易解决-and I've certainly tried!不过,我至少可以帮助解释why