如何在asp.net mvc中显示必填字段和显示错误信息?

时间:2016-06-02 07:37:15

标签: asp.net-mvc razor

  1. 应用程序有一个允许用户选择/多选
  2. 的表单
  3. 下拉列表中的内容是从数据库中检索的,而不是硬编码的:

    <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>
    
  4. 表单的布局(列名,样式等)在脚本文件夹中,作为.js文件,下拉列表中的内容在视图文件夹中,作为.cshtml文件。

  5. 所以我的问题是 1.为什么布局和内容在不同的地方定义? 2.我想创建一些标有星号的字段,如果未选中,该字段将在客户端显示警告(如红色框)。我该怎么办?我应该在cshtml文件中添加一些必需的属性吗? 3.我希望该字段向用户显示选择了哪个/多个字段。我该怎么办? 4.由于每个字段下有很多选项,如何在下拉列表中实现搜索框(不区分大小写)?

    我是mvc模特的新手,所以我非常感谢能帮助我理解的任何帮助,谢谢!

1 个答案:

答案 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 &lt;label&gt; 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)为所需的“名称”属性呈现标签。