【问题标题】:Using MvcContrib's strongly typed RedirectToAction with an anchor tag (hashtag)?将 MvcContrib 的强类型 RedirectToAction 与锚标记 (hashtag) 一起使用?
【发布时间】:2012-09-17 00:43:03
【问题描述】:

我正在使用 MvcContrib 的强类型 RedirectToAction() 从一个控制器动作重定向到另一个控制器动作,同时避免在我的应用程序流中使用魔法字符串,如下所示:

this.RedirectToAction<FooController>(c => c.Bar());

然后重定向到

/foo/bar/    

...但现在我希望能够重定向到末尾带有锚点/井号标签的 URL,并将窗口滚动到 &lt;a name="yarrr" /&gt; 标签,如下所示:

/foo/bar/#yarrr  

我可以将主题标签放在 TempData[] 中,将其写入一个 javascript 变量并通过 javascript 滚动窗口 - 但我宁愿遵循约定并将主题标签作为我的 URL 的结尾。

对此有何想法或自制解决方案? MvcContrib 似乎不支持它。

【问题讨论】:

  • @nemesv,不幸的是,这个骗局没有得到答复。我已经回答了这个问题,因为这是我在这个主题上看到的第一个问题。

标签: asp.net-mvc-3 mvccontrib


【解决方案1】:

我不知道 MvcContrib 中存在这样的 ActionLink 重载,但编写一个将是微不足道的:

using System;
using System.Linq.Expressions;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Web.Routing;

public static class HtmlExtensions
{
    public static IHtmlString ActionLink<TController>(
        this HtmlHelper html,
        Expression<Action<TController>> action,
        string linkText,
        object htmlAttributes,
        string fragment
    ) where TController : Controller
    {
        var routeValues = Microsoft.Web.Mvc.Internal.ExpressionHelper
            .GetRouteValuesFromExpression(action);
        return html.RouteLink(
            linkText: linkText,
            routeName: null,
            protocol: null,
            hostName: null,
            fragment: fragment,
            routeValues: routeValues,
            htmlAttributes: new RouteValueDictionary(htmlAttributes)
        );
    }
}

然后在你看来:

@(Html.ActionLink<FooController>(c => c.Bar(), "click me", null, "yarrr"))

更新:

显然我误解了你的问题,因为你在控制器中寻找 RedirectToAction 方法,而不是在视图中。我的回答和之前一样:I am not aware of the existence of such an RedirectToAction overload in MvcContrib but writing one would be trivial:

using System;
using System.Linq.Expressions;
using System.Web.Mvc;

public static class HtmlExtensions
{
    public static RedirectResult RedirectToAction<TController>(
        this Controller controller,
        Expression<Action<TController>> action,
        string fragment
    ) where TController : Controller
    {
        var routeValues = Microsoft.Web.Mvc.Internal.ExpressionHelper
            .GetRouteValuesFromExpression(action);
        var urlHelper = new UrlHelper(controller.ControllerContext.RequestContext);
        return new RedirectResult(
            UrlHelper.GenerateUrl(
                routeName: null,
                actionName: null,
                controllerName: null,
                protocol: null,
                hostName: null,
                fragment: fragment,
                routeValues: routeValues,
                routeCollection: urlHelper.RouteCollection,
                requestContext: controller.ControllerContext.RequestContext,
                includeImplicitMvcValues: true
            )
        );
    }
}

然后在你的控制器内部:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return this.RedirectToAction<FooController>(c => c.Bar(), "yarrr");
    }
}

【讨论】:

  • MvcContrib 的 RedirectToAction 用于从一个控制器动作重定向到另一个 - 强类型。我正在寻找一种方法来做到这一点,只是还包括一个主题标签作为参数......而不是如何在视图中生成一个 actionlink 链接。如果不清楚,我很抱歉。
  • 对你来说微不足道的事情;在没有适当知识的情况下对我来说非常困难的事情:) 非常感谢 - 我了解了 UrlHelper 和 ExpressionHelper 的启动!
  • 能否为 htmlAttributes 的 RedirectToAction 编写重载以允许打开新的浏览器选项卡。请看我的问题。谢谢stackoverflow.com/questions/14512413/…
  • @Joe,不,它不能。这应该发生在客户端上。服务器不知道浏览器的含义,更不知道浏览器选项卡。
  • Microsoft.Web.Mvc.Internal.ExpressionHelper 在 MVC4 中似乎不存在。有人在 MVC4 中有解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
相关资源
最近更新 更多