【问题标题】:How to get links to URLs in text in ASP.NET MVC 4 with Razor syntax?如何使用 Razor 语法在 ASP.NET MVC 4 中获取文本中的 URL 链接?
【发布时间】:2013-10-07 09:13:24
【问题描述】:

我有一个带有文本字段的模型。文本可以包含多个 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\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?)";

    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)

【问题讨论】:

  • 您能发布一个输出示例吗?
  • 虽然 solution 正确地将 URL 替换为链接,但它不对字段的内容进行 HTML 编码。

标签: c# asp.net asp.net-mvc-4 razor


【解决方案1】:

我对解决方案有一些疑问:

  1. 它不适用于没有点的主机名,例如 localhost 或任何其他 LAN-URL
  2. 它不适用于带有空格的 URL(小问题)
  3. 它没有对我的所有其余数据进行编码。所以如果数据库中有“
【解决方案2】:

没有类似的助手,但您可以创建自己的custom helper 或创建template for DisplayFor helper,其中将包含您需要的逻辑。

【讨论】:

    【解决方案3】:

    尝试编写自己的 Html Helper,如下所示。

    public static string Urls(this HtmlHelper helper, string value)
    {  
        var items = value.Split(';'); // use your delimiter
        var sb = new StringBuilder();
        foreach(var i in items)
        {
            if(IsUrl(i)) // write a static method that checks if the value is a valid url
                sb.Append("<a href=\"" + i + "\">" + i + "</a>,");
            else
                sb.Append(i + ",");
        }
        return sb.ToString();
    }
    

    然后这样使用

    @Html.Urls(myValue)
    

    【讨论】:

    • 这是一个普通的文本。我不能强制执行像 CSV 这样的格式。但感谢 Html Helper 提示。我想这就是要走的路。
    • 很高兴能帮上忙。但是,在您的助手内部,您可以使用 RegEx 将每个 url 替换为 html 锚。简单和非结构化的文本也应该没问题。
    【解决方案4】:

    如果文本包含 mvc URL,您可以使用@Html.Action(actionName)

    【讨论】:

    • 文本中可以有多个 URL。我希望每个 URL 都有单独的链接。
    • 你可以试试普通的锚标签 而不是 HTML 助手。
    猜你喜欢
    • 2013-06-20
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2020-10-02
    • 2012-12-22
    相关资源
    最近更新 更多