首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我需要什么样的途径才能提供虚荣心的网址?

我需要什么样的途径才能提供虚荣心的网址?
EN

Stack Overflow用户
提问于 2012-11-26 04:11:57
回答 2查看 1.4K关注 0票数 1

我想为我的用户提供一个虚荣心网址,比如:

代码语言:javascript
运行
复制
www.foo.com/sergio

我需要创造什么样的路线?

假设我有以下控制器和操作,如何将虚空URL映射到该控制器?

代码语言:javascript
运行
复制
public ActionResult Profile(string username)
{
    var model = LoadProfile(username);
    return View(model);
}

下面是我尝试过的事情和发生的事情:

备选案文A:

每个url都在这个路径中被捕获,这意味着我输入的每个URL都指向帐户控制器,而不仅仅是foo.com/[USERNAME]。不是很好。

代码语言:javascript
运行
复制
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Profile",
        "{username}",
        new { controller = "Account", action = "Profile", username = UrlParameter.Optional }
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}

备选方案B:

默认路由运行良好,但是当尝试访问配置文件foo.com/[USERNAME]时,我会得到HTTP404错误。

代码语言:javascript
运行
复制
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "DentistProfile",
        "{username}",
        new { controller = "Account", action = "Profile", username = UrlParameter.Optional }
    );
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-30 08:07:49

一种解决方案可以是使用自定义路由约束,

代码语言:javascript
运行
复制
public class VanityUrlContraint : IRouteConstraint
{
    private static readonly string[] Controllers =
        Assembly.GetExecutingAssembly().GetTypes().Where(x => typeof(IController).IsAssignableFrom(x))
            .Select(x => x.Name.ToLower().Replace("controller", "")).ToArray();

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values,
                      RouteDirection routeDirection)
    {
        return !Controllers.Contains(values[parameterName].ToString().ToLower());
    }
}

并把它当作

代码语言:javascript
运行
复制
    routes.MapRoute(
        name: "Profile",
        url: "{username}",
        defaults: new {controller = "Account", action = "Profile"},
        constraints: new { username = new VanityUrlContraint() }
    );

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

这种方法的缺点是,与现有控制器名称相同的用户名配置文件视图将无法工作,例如,如果项目中存在“资产”、“位置”和"AssetController“、"LocationController”等用户名,则“资产”、“位置”的配置文件视图将无法工作。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2012-11-27 18:09:44

你试过:

代码语言:javascript
运行
复制
routes.MapRoute(
"YourRouteName",
"{username}",
new {controller="YourController", action="Profile", username=UrlParameter.Optional}
);

这应该会诱捕www.foo.com/{username}。请记住,按添加路由的顺序检查路由,这样就可以添加

代码语言:javascript
运行
复制
routes.MapRoute(
"default",
"{controller}/{action}/{input}",
new {controller="controller", action="action", input=UrlParameter.Optional}
);

首先要维护“默认”行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13558541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档