C# 在mvc中替换文本内容中的路由

C# 在mvc中替换文本内容中的路由,c#,asp.net-mvc,C#,Asp.net Mvc,我正在我的网站上设置一项功能,要求显示存储在数据库中的内容。此内容通常会链接到站点上的其他资源 存储在数据库中: "Lorem ipsum dolor sit <a href='http://mysite.com/somecontroller/someaction'>amet</a>." “Lorem ipsum dolor sit。” 出于调试和其他原因,我不想硬编码那个url。我想替换http://mysite.com/somecontroller/someact

我正在我的网站上设置一项功能,要求显示存储在数据库中的内容。此内容通常会链接到站点上的其他资源

存储在数据库中:

"Lorem ipsum dolor sit <a href='http://mysite.com/somecontroller/someaction'>amet</a>."
“Lorem ipsum dolor sit。”
出于调试和其他原因,我不想硬编码那个url。我想替换
http://mysite.com/somecontroller/someaction
带有
UrlHelper.Action(“somecontroller”、“someaction”)


我可以根据我自己的约定写一个替代品。这将很容易,并完成我想做的事情。然而,我想我可能缺少一些更清洁或更标准的解决方案。那么,有没有一种更干净、更易于维护的方法来做到这一点,或者我应该继续使用基于约定的替换方法呢?

替换可能是最好的,也是最容易维护的。另一种处理方法是允许ASP.Net解析代码。您必须创建自己的VirtualPathProvider,这将允许除文件系统外还从数据库中提取视图。那你可以用

Html.RenderPartial(nameVirtualPathProviderUnderstands);

它将在数据库中呈现字符串,就像它是一个文件一样。虽然这不是很安全,但是您需要在VirtualPathProvider呈现内容之前修改内容。这是一个指南,它解释了如何实现您自己的VirtualPathProvider。

我在我的一个项目中做了一个类似的“hack”:

  public class UrlLinks
  {
       public static string HomeLink { get; protected set; }

       public static UrlLinks()
       {
            HomeLink = Link<HomeController>(x => x.Index());
       }

       protected static string Link<TControllerType>(Expression<Func<TControllerType, object>> expression)
       {
            return "methodName";
       }
  }
公共类URL链接
{
公共静态字符串HomeLink{get;protected set;}
公共静态URL链接()
{
HomeLink=Link(x=>x.Index());
}
受保护的静态字符串链接(表达式)
{
返回“methodName”;
}
}
基本上,链接将通过表达式和泛型参数从类型名和方法名构建,因此如果我重构,我将选择新的方法和控制器名

在我看来,我可以做到这一点——消除对魔术弦的需求:

  <a href="@UrlLinks.HomeLink">Home</a>


我想我会选择一种神奇的字符串替换方法。但是,我想我会保留您关于自定义
VirtualPathProvider
的想法,作为将来可能的重构。@Dan最大的缺点是谁在输入内容,以及内容如何与代码不同步。我必须创建自己的PathProvider,以便从使用DLL编译的资源中提取视图。结果很好,但我认为你会有更多的问题。现在,这些内容最终会通过我的部分员工传播。在我允许用户编辑之前,我知道我需要重构现有的字符串约定,或者提供一些非常健壮的ui工具和验证。@Dan请非常小心,这听起来像是XSS攻击的秘诀。我认为这是XSS攻击的秘诀。但是,在这种情况下,内容将在内部生成。如果它要回显用户输入,我会对此感到恐惧:)