2

我正在研究开发一个包含CMS的应用程序。我是一个经验丰富的网页表单开发人员,但只是真的只是进入MVC。ASP.NET MVC - CMS问题

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

首先,我目前的网络形成CMS允许用户创建一个页面,然后在“滴”任意数量的用户控件到那个他们创建的页面。我这样做的方式是在DB中与路径一起创建一个条目,然后使用LoadControl方法。

我可以看到我可以用局部视图来做到这一点,但部分视图没有代码。如果我有可能有100个控件可以放在页面上,那么这是否意味着控制器中的ViewBag需要满足所有100个控件,以防它们在视图中使用?例如,一个web表单用户控件将包含逻辑:rptItems.DataSource = blah; rptItems.DataBind()

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

其次,你将如何处理深层路由?

EG:

商店/产品/类别是好的,但对商店/产品/分类/运输/ UK是什么?我需要在global.asax中为每条我需要的路线设置一条路线吗?在Web表单中,我只是调用ReWritePath方法,并使用正则表达式自己处理路由。

感谢您的时间阅读这一点,并希望回答一些我的查询

回答

2

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

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

假设典型的路由配置,这将呼吁~/areas/store/controllers/storeControllerCategory(...)操作方法,然后可以从RouteData.Values收集虎视眈眈deliveryuk

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

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

和路径:

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

DeliveryUK会分别映射到类别和区域参数。任何超出uk的内容仍然可以通过RouteData.Values集合获得。这假定你没有更具体的路线,如

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

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

关于第一个问题:

可以动态地生成查看源代码,并返回它作为控制器的字符串,无需通过ViewBag传递了很多东西。如果来自CMS数据库的虚拟页面需要包含部分视图,则在生成页面时,您应该添加对这些组件的引用。 (这可能会也可能不会解决您的问题 - 如果没有,请提供更多信息。)

+0

谢谢大卫。路由问题是找到一种解决方案,允许客户端创建尽可能多的嵌套URL。所以,理论上他们可以有Dir1/Dir2/Dir3/Dir4 ....等等。在网络形式。我会将每个请求引导至Page.aspx文件,然后根据数据库中的URL重新编写路径。 – Paul