我正在尝试使用Materialize.css中的data-error属性来处理使用ASP.NET Core的表单的所有错误消息。我有一个使用属性进行服务器端验证的模型类。我想用模型中的验证设置填充几个HTML属性,以避免重复代码。
例如,我想做类似以下的事情:
<span>
但是,ASP.NET生成的user_id=4
标记会导致问题。有没有办法在没有标记的情况下获取原始文本?
答案 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);
}
}