下拉列表中的内容是从数据库中检索的,而不是硬编码的:
<select class="btn btn-default col-md-1" name="fy_dropdown" id="fy_dropdown">
@foreach (var fy in Model.FYIndex)
{
<option value="@fy">@fy</option>
}
</select>
表单的布局(列名,样式等)在脚本文件夹中,作为.js文件,下拉列表中的内容在视图文件夹中,作为.cshtml文件。
所以我的问题是 1.为什么布局和内容在不同的地方定义? 2.我想创建一些标有星号的字段,如果未选中,该字段将在客户端显示警告(如红色框)。我该怎么办?我应该在cshtml文件中添加一些必需的属性吗? 3.我希望该字段向用户显示选择了哪个/多个字段。我该怎么办? 4.由于每个字段下有很多选项,如何在下拉列表中实现搜索框(不区分大小写)?
我是mvc模特的新手,所以我非常感谢能帮助我理解的任何帮助,谢谢!
答案 0 :(得分:0)
回答你的第二个问题:MVC已经内置验证。
要创建所需的属性,请在ViewModel中使用[System.ComponentModel.DataAnnotations.Required]
属性对其进行注释。
您还可以通过引用resx文件中的键来提供自定义错误消息。该密钥应该有一个占位符作为属性的名称。
示例:
DataAnnotationsResources.resx
<data name="RequiredAttribute_ValidationError" xml:space="preserve">
<value>The {0} field is required.</value>
</data>
using System.ComponentModel.DataAnnotations;
public class ExampleCreateViewModel {
// Name is required for create!
[Required(ErrorMessageResourceType = typeof(DataAnnotationsResources), ErrorMessageResourceName = "RequiredAttribute_ValidationError")]
public string Name {get; set;}
}
要使用星号渲染必需的字段,可以对HTML帮助程序使用以下扩展方法。它使用内置的Html.LabelFor帮助器和YAML ym-required
类来设置asterix的样式。
/// <summary>
/// Renders a Label for the Property
/// If [DisplayName] Attribute was set, it uses it as Translation Key
/// Else it uses the Property Name as label
/// If Required Attribute was set and <see cref="showHint"/> == <code>true</code>, attaches an red asterix * to the label
/// </summary>
/// <param name="html">HTML Helper object.</param>
/// <param name="metaDataAccessor">Lambda to access the property that contains the metadata (DisplayName, Required Attributes)</param>
/// <param name="forFieldAccessor">Lambda to set the property that is referenced by the "for" HTML attribute of the <label> tag</param>
/// <param name="showHint">Set to <code>false</code> to never show the red asterix * even if the Property is required (e.g. not nullable value Properties like <code>bool</code>)</param>
public static MvcHtmlString LabelForPlusHint<TModel, TMetaDataValue, TForFieldValue>(this HtmlHelper<TModel> html,
Expression<Func<TModel, TMetaDataValue>> metaDataAccessor,
Expression<Func<TModel, TForFieldValue>> forFieldAccessor,
bool showHint = true) {
var metadata = ModelMetadata.FromLambdaExpression(metaDataAccessor, html.ViewData);
var label = html.LabelFor(forFieldAccessor).ToHtmlString();
if (metadata.IsRequired && showHint) {
label = label.Replace("</label>", "<sup class=\"ym-required\">*</sup></label>");
}
return new MvcHtmlString(label);
}
public static MvcHtmlString LabelForPlusHint<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> metaDataAccessor, bool showHint = true) {
return LabelForPlusHint(html, metaDataAccessor, metaDataAccessor, showHint);
}
用法示例:@Html.LabelForPlusHint(m => m.Name)
为所需的“名称”属性呈现标签。