12

我想编写一个 HtmlHelper 来呈现具有预设值的 ActionLink,例如。

<%=Html.PageLink("Page 1", "page-slug");%>

where是一个使用已知 Action 和 ControllerPageLink调用的函数,例如。ActionLink“索引”和“页面”。

由于或类中不存在HtmlHelper并且UrlHelper不存在Controller,我如何从类中获取操作的相对 URL?

更新:鉴于我现在拥有的额外三年积累的经验,这是我的建议:只是使用Html.ActionLink("My Link", new { controller = "Page", slug = "page-slug" })或更好,

<a href="@Url.Action("ViewPage",
                     new {
                           controller = "Page",
                           slug = "my-page-slug" })">My Link</a>

您的扩展方法可能既可爱又简短,但它增加了另一个未经测试的故障点和对员工的新学习要求,而不会增加任何实际价值。把它想象成设计一个复杂的系统。为什么要添加另一个移动部分,除非它增加了可靠性(否)、可读性(很少,一旦您阅读更多文档)、速度(无)或并发性(无)。

4

1 回答 1

20

不确定我是否真的清楚地理解了你的问题,但是,让我试试。

要像您描述的那样创建 HtmlHelper 扩展,请尝试以下操作:

using System;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace Something {
    public static class PageLinkHelper
    {
        public static string PageLink(
            this HtmlHelper helper,
            string linkText, string actionName,
            string controllerName, object routeValues,
            object htmlAttributes)
        {
            return helper.ActionLink(
                linkText, actionName, controllerName,
                routeValues, htmlAttributes);
        }
    }
}

至于您关于从类中获取 URL 的问题,取决于您将实现它的类。例如,如果您想从 HtmlHelper 扩展中获取当前控制器和操作,您可以使用:

string currentControllerName = (string)helper.ViewContext
    .RouteData.Values["controller"];
string currentActionName = (string)helper.ViewContext
    .RouteData.Values["action"];

如果您想从控制器中获取它,您可以使用基类 (Controller) 中的属性/方法来构建 URL。例如:

var url = new UrlHelper(this.ControllerContext.RequestContext);
url.Action(an_action_name, route_values);
于 2010-04-11T13:30:24.883 回答