【问题标题】:How to mask the controller and action name from the browser?如何从浏览器中屏蔽控制器和操作名称?
【发布时间】:2015-12-07 15:15:48
【问题描述】:

我只想在浏览器中显示主机 url。

例子:

www.test.com/account/login 或 www.test.com/contact/index 或 www.test.com/order/details/12

只显示:

www.test.com

在浏览器中

【问题讨论】:

  • 您希望如何导航到任何地方?
  • 仅使用表单发布事件
  • 你不能!除非您导航到默认路线,否则您必须指定控制器和操作
  • 在大多数银行软件中的 url 都被屏蔽了,这样用户只能在浏览器中看到主机 url 而不是整个 url。这就是我想要做的。
  • 那你可能要去SPA了

标签: asp.net-mvc url-rewriting asp.net-mvc-routing


【解决方案1】:

首先,就可用性和 SEO 而言,所谓的“优质内容”是您的用户可以链接到的内容

如果您构建一个没有 URL 路径的“页面”,那么您的用户将无法链接到它、共享链接等。搜索引擎也将无法抓取它,因此它不会获得索引。

在某些情况下(安全问题),可能需要此行为以防止资源在用户之间共享。

标准方式

在这种情况下,您最好的选择是在 JavaScript 框架(如 AngularJS)的帮助下创建单页应用程序(请参阅此 tutorial 以开始使用)。与服务器交互(交换数据)的最佳选择是使用WebApi,但任何“导航”都完全在浏览器中进行。

非标准方式

另一个选项是在 MVC 中自定义路由,以便它可以从请求的另一部分读取导航,并提出一些自定义约定来确定从请求中生成哪些路由值,以便 MVC 知道要调用哪个控制器操作。您可以通过 custom RouteBase 实现来做到这一点。

这是一个例子:

查看

@using (Html.BeginForm())
{
    <input type="hidden" name="location-controller" value="Home" />
    <input type="hidden" name="location-action" value="Index" />

    <input type="submit" value="Home" />
}

@using (Html.BeginForm())
{
    <input type="hidden" name="location-controller" value="Home" />
    <input type="hidden" name="location-action" value="Contact" />

    <input type="submit" value="Contact" />
}

@using (Html.BeginForm())
{
    <input type="hidden" name="location-controller" value="Home" />
    <input type="hidden" name="location-action" value="About" />

    <input type="submit" value="About" />
}

无路径路径

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication12
{
    public class PathlessRoute : RouteBase
    {
        public override RouteData GetRouteData(HttpContextBase httpContext)
        {
            RouteData result = null;
            var form = httpContext.Request.Form;

            // Skip any forms that are not part of our scheme
            if (form != null && form.HasKeys())
            {
                var controller = form["location-controller"];
                var action = form["location-action"];

                if (!string.IsNullOrWhiteSpace(action))
                {
                    // Default controller to "Home"
                    if (string.IsNullOrWhiteSpace(controller))
                    {
                        controller = "Home";
                    }

                    result = new RouteData(this, new MvcRouteHandler());
                    result.Values["controller"] = controller;
                    result.Values["action"] = action;

                    // TODO: Work out scheme to pass custom route values (such as "id")
                }
            }

            return result;
        }

        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
        {
            return null;
        }
    }
}

用法

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.Add("Pathless", new PathlessRoute());

        routes.MapRoute(
            name: "Home",
            url: "",
            defaults: new { controller = "Home", action = "Index" }
        );
    }
}

现在,当您单击“联系”提交按钮时,您将获得联系视图,但该 URL 将没有指示您正在查看的页面的路径。


您可以通过创建自己的HTML helper extension method 来呈现您的表单标签,就像您可以使用ActionLink 创建超链接一样,来进一步改进。

@Html.ActionLinkPost(name: "Contact", action: "Contact", controller: "Home")

您甚至可以为按钮设置样式,使其看起来像超链接,或者使用一些 JavaScript 来制作发布的真正超链接。


但是,如果您沿着这条路走下去,您就是在新水域游泳,并且违反了标准的 HTTP 约定(例如,您正在使用不标准的 POST 导航)。您可以肯定,您不会在网络上找到很多(如果有的话)支持这种方法来克服您可能遇到的任何陷阱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 2015-05-10
    • 2011-03-18
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多