C# 将生成的HTML传递给视图,并用Url.Action替换链接

C# 将生成的HTML传递给视图,并用Url.Action替换链接,c#,html,asp.net-mvc,C#,Html,Asp.net Mvc,作为MVC项目的一部分,我需要显示存储在数据库中的网页。假设我有一个索引页(存储在数据库中),其中有一个指向page1.html(也存储在数据库中)的链接,简单地说就是。我目前拥有的是一个控制器(称为WebpageGenerator),它将页面名称作为参数,从数据库检索html,执行一些操作,并将结果字符串传递给视图。我的观点只不过是 <div class="generatedPage"> @Html.Raw(ViewBag.PageData) </div> 不幸的是,

作为MVC项目的一部分,我需要显示存储在数据库中的网页。假设我有一个索引页(存储在数据库中),其中有一个指向page1.html(也存储在数据库中)的链接,简单地说就是
。我目前拥有的是一个控制器(称为WebpageGenerator),它将页面名称作为参数,从数据库检索html,执行一些操作,并将结果字符串传递给视图。我的观点只不过是

<div class="generatedPage">
@Html.Raw(ViewBag.PageData)
</div>
不幸的是,在生成的页面中,该链接显示为
localhost:port/MyProject/@Url.Action(%22Index%22,%20%22WebpageGenerator%22,%20new%20%7Bid=%22page1.html%22%7D)
如果我将鼠标悬停在该链接上,并检查它是否显示

显然,这个链接不起作用。我实现此功能的一种方法是在控制器中硬编码url,如下所示:

var addUrl = HttpContext.Request.UrlReferrer.AbsoluteUri;
string newLink = addUrl.Contains("WebpageGenerator") ? linkName.OnlyPageName()) : String.Format("WebpageGenerator/{0}", linkName.OnlyPageName());
我必须检查引用的URL,否则如果我正在查看page1.html,其中包含指向page2.html的链接,该链接将指向localhost:port/MyProject/WebpageGenerator/WebpageGenerator/page2.html

这看起来像是一个肮脏的补丁,我甚至不确定它在发布/部署应用程序时是否会起作用。任何帮助都将不胜感激


PS-我在SO上的第一篇帖子。感谢多年来的帮助。

您正在将呼叫
@Url.Action(…)
包装到字符串中。问题是Razor引擎不会将其视为一个指令,只会输出它

将此更改为调用
Url.Action(…)
,应该可以正常工作

string newLink = Url.Action("Index", "WebpageGenerator", new { id=linkName.OnlyPageName()});
完整片段:

    [HttpGet, ActionName("Index")]
    public ActionResult WebpageGenerator(string id)
    {
        StringBuilder pageText = GetHTMLFromDB(id);
        string linkName = GetLink(pageText) //should now contain <a href="page1.html">
        string newLink = Url.Action("Index", "WebpageGenerator", new { id=linkName.OnlyPageName()});
        pageText.Replace(linkName, newLink);
        ViewBag.PageData = pageText.ToString();
        return View();
    }
[HttpGet,ActionName(“索引”)]
公共操作结果网页生成器(字符串id)
{
StringBuilder pageText=GetHTMLFromDB(id);

string linkName=GetLink(pageText)//现在应该包含当您构建
newLink
变量时,不要放置
@Url.Action()
在字符串中,改为调用它。返回的任何内容都应分配给
newLink
Hi@DaveBecker在控制器中如何调用它?很抱歉,没有问题!像这样:
string newLink=Url.Action(“Index”,“WebpageGenerator”,new{id=linkName.OnlyPageName()})
@DaveBecker太阳又亮了!非常感谢。我真不敢相信我错过了你也可以在控制器中调用它的事实。酷,我很高兴。我将添加这个作为正确的答案,这样它也可以帮助其他人。
    [HttpGet, ActionName("Index")]
    public ActionResult WebpageGenerator(string id)
    {
        StringBuilder pageText = GetHTMLFromDB(id);
        string linkName = GetLink(pageText) //should now contain <a href="page1.html">
        string newLink = Url.Action("Index", "WebpageGenerator", new { id=linkName.OnlyPageName()});
        pageText.Replace(linkName, newLink);
        ViewBag.PageData = pageText.ToString();
        return View();
    }