虚荣URL重新路由

时间:2012-05-30 17:16:46

标签: asp.net-mvc-3 asp.net-mvc-routing

我正在尝试允许网站上的用户指定并更改自己唯一的虚荣网址。

我将把选择的url存储在数据库中,我想调用它来重新路由到用户。

截至目前,这就是我所拥有的,但我不确定从何处开始。

routes.MapRoute(
            "User", // Route name
            "User/Profile/{id}", // URL with parameters
            new { controller = "User", action = "Profile", id = UrlParameter.Optional }, // Parameter defaults
            new string[] { typeof(MvcApplication).Namespace + ".Controllers" }
        );

我有什么方法可以接受虚荣网址并将其重新路由到PersonID吗?

我还试图操纵ActionResult来处理字符串Vanity Url或int PersonID,但这似乎没有朝正确的方向发展,所以我回到了routes.Maproute。

编辑:

我希望用户能够输入

http://localhost:60619/User/Profile/Vanity 

并且他们将会像进入

一样进入同一个地方
http://localhost:60619/User/Profile/224 Assuming the PersonID is 224

的ActionResult:

        public ActionResult Profile(int ID)
    {
        ppUser viewerChoice = DB.ppUser_GetUserByPersonID(ID);
        return View(ID);
    }

2 个答案:

答案 0 :(得分:0)

所以答案是虚荣URL不会根据URL重新路由到每个用户的单独视图。

相反,虚荣URL会将所有用户路由到同一视图,视图内容将根据虚荣URL的值进行更改。在这种情况下,虚荣URL的工作方式与数据库ID完全相同。

例如:

  • :// XXX /用户/资料/麦克
  • :// XXX /用户/资料/史蒂夫
  • :// xxx / User / Profile / Peter
  • :// XXX /用户/资料/索尼娅

所有人都会路由相同的视图。

因此控制器内的代码将加载基于Mike,Steve,Peter等的内容

这相当于根据个人资料ID 24,56,88等加载内容

您必须保证虚荣网址是唯一的,就像个人资料ID

一样

以下是有关如何创建表格的示例:

USE [mydb]
GO

/****** Object:  Table [dbo].[Vanity]    Script Date: 05/30/2012 13:53:57 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Vanity](
    [ProfileID] [int] NOT NULL,
    [VanityURL] [nvarchar](50) NOT NULL,
    [UserName] [nvarchar](50) NULL,
    [Password] [nvarchar](50) NULL,
 CONSTRAINT [PK_Vanity] PRIMARY KEY CLUSTERED 
(
    [ProfileID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


USE [mydb]
/****** Object:  Index [IX_Vanity]    Script Date: 05/30/2012 13:53:57 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_Vanity] ON [dbo].[Vanity] 
(
    [VanityURL] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Vanity]  WITH CHECK ADD  CONSTRAINT [FK_Vanity_Vanity] FOREIGN KEY([ProfileID])
REFERENCES [dbo].[Vanity] ([ProfileID])
GO

ALTER TABLE [dbo].[Vanity] CHECK CONSTRAINT [FK_Vanity_Vanity]
GO

答案 1 :(得分:0)

你可以使用这样的东西,它对我有用,通过使用下面的代码,你可以在一个域上放置两个不同的页面,只需区分那里

    protected void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
    }

    public static void RegisterRoutes(RouteCollection routeCollection)
    {
        routeCollection.MapPageRoute("RouteForCustomer", "{Id}", "~/User.aspx");
        routeCollection.MapPageRoute("RouteForCustomer", "Home", "~/Default.aspx");
    }