ASP.NET MVC - CMS问题

时间:2011-09-14 14:50:46

标签: asp.net-mvc content-management-system asp.net-mvc-routing

我正在开发一个包含CMS的应用程序。我是一名经验丰富的Web表单开发人员,但实际上只是进入MVC。

我有几个问题希望你们中的一些人能够回答:

首先,我当前的Web表单CMS允许用户创建页面,然后将任意数量的用户控件“删除”到他们创建的页面上。我这样做的方法是在DB中创建一个条目和路径,然后使用LoadControl方法。

我可以看到我可以使用部分视图执行此操作,但部分视图后面没有代码。如果我可能有100个人可以放到页面上的控件,这是否意味着控件中的ViewBag需要满足所有100个控件,以防它们在视图中使用?例如,Web表单用户控件将包含逻辑:rptItems.DataSource = blah; rptItems.DataBind()

使用MVC,我假设逻辑将在视图控制器中,视图将通过ViewBag访问它?我对如何做到这一点感到有些困惑。

其次,您将如何处理深度路由?

EG:

商店/产品/类别很好,但商店/产品/类别/交货/英国呢?我需要在global.asax中为我需要的每条路线设置一条路线吗?在Web表单中,我只调用了ReWritePath方法并使用正则表达式自行处理路由。

感谢您抽出时间阅读本文,并希望能够回答我的一些疑问

1 个答案:

答案 0 :(得分:2)

对于您的第二个问题(即“深度路由”),您可以在控制器中处理此问题,而不是添加实际路由。网址的每个部分都可以通过控制器操作中的RouteData.Values集合获得。所以,您的路线可能看起来像

~/Store/Products/Category/{*params}

假设典型的路由配置,这将调用Category(...)上的~/areas/store/controllers/storeController操作方法,然后可以从delivery集合中抓取ukRouteData.Values

还有很多其他方法 - 在数据库中存储路径并使用相关的元数据来找到正确的控制器和方法 - 但我认为这是最简单的方法。此外,它可能是显而易见的,但如果您在示例中只需要“类别”之外的两个参数,则可以使用

public ActionResult Category(string category, string region)
{
...
}

和路线:

~/store/{controller}/{action}/{category}/{region}/{*params}

DeliveryUK将分别映射到category和region参数。除uk以外的任何内容仍可通过RouteData.Values集合获得。这假设您没有更具体的路线,例如

~/store/{controller}/{action}/{category}/{region}/{foo}/{bar}/{long_url}/{etc}

这将是一个更好的匹配。 ({* params}可能与第二条路线发生冲突;您必须进行调查以确定是否存在问题。)

关于你的第一个问题:

您可以动态生成视图源并将其作为字符串从控制器返回,从而无需通过ViewBag传递大量内容。如果CMS数据库中的虚拟页面需要包含部分视图,则应在生成页面时添加对这些组件的引用。 (这可能会或可能不会解决您的问题 - 如果没有,请提供更多信息。)