【问题标题】:Render all content and action urls as absolute urls without changing the viewpage将所有内容和操作 url 呈现为绝对 url,而不更改视图页面
【发布时间】:2016-04-11 08:40:03
【问题描述】:

如果请求引用者的来源与请求自身的来源不同,我想将视图中的所有 url 呈现为绝对 url。

因此,如果站点 http://www.hostsite.com 有一个从 http://www.example.com/controller/action 提取内容的页面,则以下视图页面

@using (Ajax.BeginForm("Save", new AjaxOptions {}))
{
    @Html.ActionLink("More..", "More")
    <img src="~/Content/img.jpg" />
    <input type="submit" value="Save" />
}

应该呈现为

<form action="http://www.example.com/controller/Save" data-ajax="true" id="form0" method="post">
    <a href="http://www.example.com/controller/More">More...</a>
    <img src="http://www.example.com/Content/img.jpg" />
    <input type="submit" value="Save" />
</form>

注意在html中使用“~/”的url也应该固定为绝对的。

如果可能的话,我想通过覆盖一些基本 url 生成代码来实现这一点,而不是创建额外的帮助程序。

是否可以覆盖 mvc 的 url 输出功能而不必更改视图页面本身的单个细节(例如使用自定义帮助程序)?如果是这样,我可以用来覆盖此输出行为的挂钩点在哪里?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 razor-2


    【解决方案1】:

    您可以如下创建自定义 Actionlink 方法

    public static HtmlString CustomActionLink(this HtmlHelper htmlHelper
                                            ,string linkText,string action,string controller)
        {           
            return new HtmlString(String.Format("<a href=http://www.example.com/{0}/{1}>{2}</a>", controller, action,linkText));
        }
    

    这将返回您想要的 URL。

    视图中的用途

     @Html.CustomActionLink("DemoLink","Index","Home")
    

    这将产生所需的输出

    <a href="http://www.example.com/Home/Index">DemoLink</a>
    

    DemoLink

    同样,您可以为 ActionResult 的其他重载和图像创建辅助方法。

    【讨论】:

    • 我特别不想创建“助手”方法。我想覆盖 ViewEngine 及其关联类(如 ViewPage)的行为。
    • 视图引擎负责渲染视图,我们可以覆盖视图的路径,我们可以改变视图的物理位置,即我们可以将视图放置在虚拟文件位置,例如数据库服务器甚至在 DLL 中而不是物理文件存储中。但是您试图实现的行为不是视图引擎的责任。控件将如何呈现以及将为控件生成哪些 HTML 由帮助程序类处理和管理。所以必须覆盖相同的内容。
    • &lt;img src="~/Content/img.jpg" /&gt; 不是由助手渲染的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2015-09-29
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多