从Html.ValidationMessageFor中删除<span>

时间:2017-08-03 13:15:03

标签: asp.net validation asp.net-core materialize

我正在尝试使用Materialize.css中的data-error属性来处理使用ASP.NET Core的表单的所有错误消息。我有一个使用属性进行服务器端验证的模型类。我想用模型中的验证设置填充几个HTML属性,以避免重复代码。

例如,我想做类似以下的事情:

<span>

但是,ASP.NET生成的user_id=4标记会导致问题。有没有办法在没有标记的情况下获取原始文本?

1 个答案:

答案 0 :(得分:0)

您可以使用带扩展方法的类在span标记之间提取文本,如下所示:

public static class DeleteSpan //Name of class could be any you want
{
    public static HtmlString ValidationTextNoTags<TModel, TProperty>(this IHtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        var result = "";
        Regex regex = new Regex("<span.*?>(.*?)<\\/span>");//regular expression to extract text between span tags

        using (var writer = new StringWriter())
        {
            htmlHelper.ValidationMessageFor(expression).WriteTo(writer, HtmlEncoder.Default);
            result = writer.ToString();
        }
        //get the actual content between tags
       result = regex.Match(result).Groups[1].ToString();

       return new HtmlString(result);
    }
}

然后在视图中使用:

     @Html.ValidationTextNoTags(m => m.FirstName)

        <div class="col-md-4" data-error="@Html.ValidationTextNoTags(m =>m.FirstName)">
            <input type="text" name="FirstName" class="form-control" />
        </div>

更新:由于我们始终处理单span个标记,因此我们只能使用Substring代替正则表达式:

public static class DeleteSpan
{
    public static HtmlString ValidationTextNoTags<TModel, TProperty>(this IHtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        var result = "";

        using (var writer = new StringWriter())
        {
            htmlHelper.ValidationMessageFor(expression).WriteTo(writer, HtmlEncoder.Default);
            result = writer.ToString();
        }
        //get the actual content between tags
        result = result.Substring(result.IndexOf(">") + 1, result.IndexOf("</span>") - result.IndexOf(">") - 1);

        return new HtmlString(result);

    }
}