基本上我有一个使用ASP.NET MVC构建的CMS后端,现在我正在进入前端站点,需要能够根据输入的路由从我的cms数据库加载页面。

因此,如果用户输入domain.com/students/information,MVC将查看页面表以查看是否存在具有与学生/信息匹配的永久链接的页面,如果是,则将重定向到页面控制器然后加载页面来自数据库的数据并将其返回到视图以供显示。

到目前为止,我已尝试捕获所有路径,但它仅适用于两个URL段,因此/学生/信息,但不是/ students / information / fall。 我在网上找不到任何关于如何实现这一点的内容,所以我会在这里问一下,在我找到并开源ASP.NET MVC cms并剖析代码之前。

这是我到目前为止的路由配置,但我觉得有更好的方法来做到这一点。

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

        // Default route to handle core pages
        routes.MapRoute(null,"{controller}/{action}/{id}",
                        new { action = "Index", id = UrlParameter.Optional },                  
                        new { controller = "Index" }
        );

        // CMS route to handle routing to the PageController to check the database for the route.


        var db = new MvcCMS.Models.MvcCMSContext();
        //var page = db.CMSPages.Where(p => p.Permalink == )
        routes.MapRoute(
            null,
            "{*.}",
            new { controller = "Page", action = "Index" }
        );          
    }

如果有人能指出我如何从数据库加载CMS页面,最多有三个URL段,并且仍然能够加载具有预定义控制器和操作的核心页面。

===============>>#1 票数:120 已采纳

您可以使用约束来决定是否覆盖默认路由逻辑。

public class CmsUrlConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var db = new MvcCMS.Models.MvcCMSContext();
        if (values[parameterName] != null)
        {
            var permalink = values[parameterName].ToString();
            return db.CMSPages.Any(p => p.Permalink == permalink);
        }
        return false;
    }
}

在路线定义中使用它,比如

routes.MapRoute(
    name: "CmsRoute",
    url: "{*permalink}",
    defaults: new {controller = "Page", action = "Index"},
    constraints: new { permalink = new CmsUrlConstraint() }
);

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

现在,如果您在“页面”控制器中有“索引”操作,例如,

public ActionResult Index(string permalink)
{
    //load the content from db with permalink
    //show the content with view
}
  1. 所有网址都将被第一条路线捕获并通过约束进行验证。
  2. 如果db中存在永久链接,则url将由Page controller中的Index操作处理。
  3. 如果不是约束将失败并且url将回退到默认路由(我不知道你是否在项目中有任何其他控制器以及你将如何决定你的404逻辑)。

编辑

为了避免在Page控制器的Index操作中重新查询cms页面,可以使用HttpContext.Items字典,如

在约束中

var db = new MvcCMS.Models.MvcCMSContext();
if (values[parameterName] != null)
{
    var permalink = values[parameterName].ToString();
    var page =  db.CMSPages.Where(p => p.Permalink == permalink).FirstOrDefault();
    if(page != null)
    {
        HttpContext.Items["cmspage"] = page;
        return true;
    }
    return false;
}
return false;

然后在行动中,

public ActionResult Index(string permalink)
{
    var page = HttpContext.Items["cmspage"] as CMSPage;
    //show the content with view
}

希望这可以帮助。

===============>>#2 票数:0

我使用更简单的方法,不需要任何自定义路由器处理。 只需创建一个处理一些可选参数的单个/全局控制器,然后根据需要处理这些参数:

//Route all traffic through this controller with the base URL being the domain 
[Route("")]
[ApiController]
public class ValuesController : ControllerBase
{
    //GET api/values
    [HttpGet("{a1?}/{a2?}/{a3?}/{a4?}/{a5?}")]
    public ActionResult<IEnumerable<string>> Get(string a1 = "", string a2 = "", string a3 = "", string a4 = "", string a5 = "")
    {
        //Custom logic processing each of the route values
        return new string[] { a1, a2, a3, a4, a5 };
    }
}

domain.com/test1/test2/test3上的示例输出

["test1","test2","test3","",""]

  ask by Carl Weis translate from so

未解决问题?本站智能推荐:

1回复

ASP.NET MVC路由任务

我有以下路由表: 因此,当我们拥有类似http:// mysite / abcde的 url时,它调用UserController,动作索引;如果我们拥有类似http:// mysite / dashboard / Index的 url,则它称为DashboardController,动
1回复

ASP.NET MVC4路由

有人可以告诉我如何为该控制器动作编写路线吗? 我收到此错误,但不确定为什么或如何解决: The parameters dictionary contains a null entry for parameter 'PID' of non-nullable type 'System.Int32
1回复

路由问题ASP.net MVC 4没有重定向到索引操作

当我尝试使用以下URL格式访问控制器上的索引页面时: 这有效,并且Index页面打开。 但是,如果我使用这种url格式(我不将Index操作添加到URL) 我收到“ 404未找到”,但通常它应该可以正常工作,并自动将我重定向到索引页。 请如何解决? Taux控制器:
1回复

ASP.NET MVC路由不适用于.html扩展名

我使用ASP.NET MVC开发了一个Web应用程序。 我的路线有问题。 我需要这样的路线。 http://localhost/content-name/23.html 我为此定义了一条路线 但是这条路线不起作用。 IIS向我显示404页面。 当我删除.html扩展名
1回复

在ASP.net MVC4中默认定义时,路由不起作用

我在RouteConfig中定义的路由具有MVC4应用,如下所示: 如您所见,每条路线都有一个参数,我需要更改我的语言(我的业务逻辑),问题是,当我放置不带任何参数的url(例如http://www.mydomain.com)时 ,它将加载我的默认页面,但我没有语言参数,所以无法更改语言
3回复

如何在ASP.NET MVC 4中将查询字符串参数转换为路由

我有一个正在构建的博客系统,但似乎无法使ASP.NET MVC了解我的路线。 我需要的路由是/ blogs / student / firstname-lastname,因此/ blogs / student / john-doe路由到博客区域,即学生控制者的index操作,该操作需要一个
3回复

ASP.NET MVC ActionLink没有选择正确的控制器

问题背景: 我正在尝试将一个变量 - 在这种情况下是url中的int'productId'变量'传递给ActionLink方法中指定的控制器和操作方法。 问题: 我的路线设置如下: 我的'Products.cshtml'视图中的'ActionLink' - 由名为'Ho
1回复

如何在ASP.NET MVC 4中创建本地化的URL

我正在尝试在asp.net mvc中创建本地化的url。 让我解释更多。 即 ControllerName:收件人 方法名称:索引 我想根据语言更改控制器的名称。 即 “ en-gb:uk.test.com/recipt” “ fr-BE:be.test.
1回复

ASP.NET MVC:确定URL的区域+控制器+操作

情况:我正在使用MVC的AuthorizeAttribute保护我的动作。 我有几个包含INSERT,DELETE等功能的UI组件,如果应用程序的最终用户单击某个按钮,这些组件将导致操作。 只有那些允许用户执行的按钮才对用户可见。 为了避免至少两次获得用户操作许可(按钮和控制器操作),我在
1回复

我应该将RouteParameter或UrlParameter用于Asp.NET web-api路由吗?

我已经看到两个都被使用,所以我想,他们做同样的事情或不同的事情? 如果是后者,有什么区别? 我试着通过浏览视觉工作室MVC 4(rc)web api模板来尝试回答它,但遗憾的是它使用了两者,所以我的困惑仍然存在。 这是模板包含的内容: