我有一个带有文本字段的模型。文本可以包含多个 URL。它不必包含 URL,也没有特定的格式。
使用
@Html.DisplayFor(model => model.TextWithSomeUrls)
当然,文本和 URL 会像普通文本一样显示。不过,我希望将 URL 显示为有效的单个链接。在 ASP.NET / Razor 中是否有一个帮助方法?
编辑:现在输出是:
http://www.google.com, foo: bar; http://www.yahoo.com
这正是文本字段的内容。
但我想获取 URL,并且只有 URL 呈现为这样的链接:
<a href="http://www.google.com">http://www.google.com</a>, foo: bar; <a href="http://www.yahoo.com">http://www.yahoo.com</a>
我的解决方案:
public static partial class HtmlExtensions
{
private const string urlRegEx = @"((http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)";
public static MvcHtmlString DisplayWithLinksFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
string content = GetContent<TModel, TProperty>(htmlHelper, expression);
string result = ReplaceUrlsWithLinks(content);
return MvcHtmlString.Create(result);
}
private static string ReplaceUrlsWithLinks(string input)
{
Regex rx = new Regex(urlRegEx);
string result = rx.Replace(input, delegate(Match match)
{
string url = match.ToString();
return String.Format("<a href=\"{0}\">{0}</a>", url);
});
return result;
}
private static string GetContent<TModel, TProperty>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
Func<TModel, TProperty> func = expression.Compile();
return func(htmlHelper.ViewData.Model).ToString();
}
}
这个扩展现在可以在视图中使用:
@Html.DisplayWithLinksFor(model => model.FooBar)