如何根据正在执行的Action方法动态确定要使用哪个HTML“包装器”文件?

时间:2010-07-13 15:36:59

标签: c# asp.net-mvc action-filter

我们有一个MVC应用程序,它将我们的内容注入客户端提供的HTML包装器中。

有多个包装器,例如fund.html,share.html,factsheet.html和home.html

包装器存储在我们的网络服务器上。我们需要将包装器加载到Site.Master中,并将我们的内容注入包装器的内容区域,然后呈现页面。

基本上,我需要一些关于如何确定使用哪个包装器的建议。

起初,我在想我们可以将包装器映射到Controller。因此,如果我们在FundController上呈现View,我们可以使用包装器Fund.html,如果它是ShareController,我们可以使用Share.html。在BaseController中,它由FundController和ShareController实现,我得到了Controller的名称,并使用它来加载文件,一切都很好。

但随着需求的变化,很明显这不会起作用,因为有时我们需要一个控制器来渲染使用不同包装器的不同视图。因此,FundController现在可能需要提供Fund.html& Factsheet.html。现在,Controller不会直接映射到包装器文件。

然后我认为我可以使用Action名称而不是Controller名称来确定我应该使用的包装器......例如public ViewResult Fund()将对应于Fund.html,而public ViewResult Factsheet()将对应于Facthseet.html,但这并不理想,因为在BaseController中触发的方法将触发我执行的所有操作方法,包括那些返回PartialViews和其他Action Results的方法,我不想要加载包装器。我只想要ViewResults的包装器。

所以,在这种情况下,我想知道如何最好地确定哪个包装器用于我正在执行的ViewResult。一个选项是使用'魔术字符串',每当给定的Action Method执行时,它会在BaseController中设置一个属性,该属性可用于确定要使用的包装器..但我不喜欢魔术字符串。我宁愿避免采用黑客行为。

我还在考虑使用一个Action Filter,它可以完成加载与过滤器关联的Action Method关联的包装器的工作。但在此之前,我想得到其他人可能不得不处理类似此问题的意见。或者,如果有人可以建议更好的方法采取?这样做的最佳方式是什么?感谢。

3 个答案:

答案 0 :(得分:1)

听起来你已经花了很多时间思考处理这个问题的最佳方法。也许只是结合你现有的想法:

  • 默认情况下,控制器& action将根据约定检索其包装器。 FundController使用Fund.html包装器,ShareController使用Share.html包装器。
  • 但是也允许使用ActionFilter在每个操作的基础上覆盖包装器。

除非需要更改其他要求(例如,在您的母版页中的多个内容区域中有多个包装器),这应该满足您的需求,不是吗?

答案 1 :(得分:0)

我认为您的Action Filter是一个选项,或者您可能想要扩展您自己的ViewEngine,它负责决定何时使用包装器,何时不使用。

希望这会有所帮助......

答案 2 :(得分:0)

我认为模仿观点规则可能会很好。有一个规则可以查找视图,但您也可以在操作中声明视图名称。

好处是开发人员拥有相同的规则。

我不知道你怎么能实现这个,但我猜它可能。