我有一个新闻网站,其中的文章按类别标记。

我的控制器称为“类别”,此 URL:

http://mysite.com/Category/Sport

通过 Sport 采取行动 Index 在控制器中 Category.

我想允许以下 URL:

http://mysite.com/Sport/Hockey
http://mysite.com/Sport/Football
http://mysite.com/Science/Evolution

将所有类别信息传递给操作 Index 在控制器中 Category.

如何创建一条包罗万象的路线来处理所有这些并将它们分类?

有帮助吗?

解决方案

对我的问题有一个很好的回答 这里.

其他提示

你可以这样做:

routes.MapRoute("Default", "{category}/{subcategory}",
    new { controller = "CategoryController", action = "Display", id = "" }
);

然后在你的控制器中:

public class CategoryController : Controller
{
    public ActionResult Display(string category, string subcategory)
    {
        // do something here.
    }
}

不要将上面的任何路由用于所有路由(除非您在上述路由之前指定显式路由,否则您不能有“关于”页面等)。

但是,您可以包含自定义约束以将路线限制为仅现有类别。就像是:

public class OnlyExistingCategoriesConstraint : IRouteConstraint
{
    public bool Match
        (
            HttpContextBase httpContext,
            Route route,
            string parameterName,
            RouteValueDictionary values,
            RouteDirection routeDirection
        )
    {
        var category = route.DataTokens["category"];
        //TODO: Look it up in your database etc


        // fake that the category exists
        return true;
    }
}

您在路线中使用它,如下所示:

routes.MapRoute("Default", 
    "{category}/{subcategory}",
    new { controller = "CategoryController", action = "Display", id = "" },
    new { categoryExists = new OnlyExistingCategoriesConstraint() }
);

这样它就不会干扰您其他定义的路线。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top