MVC - 动态加载部分视图

时间:2009-08-10 13:55:45

标签: asp.net-mvc partial-views viewusercontrol

我正在尝试通过传递我想要的部分视图的路径列表然后在每个部分视图上调用RenderPartial来动态地将部分视图加载到视图中。这似乎可以解决问题。当我尝试将模型传递给局部视图时,会出现问题。由于我正在动态加载它们,因此我并不确切知道要为该特定局部视图传递哪个模型。我不想填充每个可能的对象,我正在考虑使用每个局部视图的配置查找反射来动态加载模型。我还在考虑添加一个ActionFilter,它会自动为我填充正确的模型值,但即使这个实现也必须使用Reflection。有没有人有任何其他建议?

我错过了一些我在MVC中没有看到的常规ASP.NET用户控件。用户控件封装了自己的数据检索逻辑,而在MVC中,主控制器需要知道它。这意味着如果我要为另一个控制器使用局部视图,那么该控制器也必须知道如何获取该局部视图的模型。我在这里错过了什么吗?感谢。

2 个答案:

答案 0 :(得分:4)

如果您希望能够执行您所描述的内容,您可能会对阅读Html.RenderAction()感兴趣。这在许多情况下都很有用,但不是“纯粹的”MVC(也许是实用的MVC)。

我有类似的情况,我使用部分视图加载不同的搜索屏幕(搜索提交按钮是相同的),只是表单字段是不同的。

我是按照以下方式做的。在公共基类控制器中,我有泛型类型参数,我将其传递给视图模型对象(SearchObject是对象类型)。

public abstract class SampleController<T>  : Controller where T : new()
public virtual ActionResult SearchForDocuments()
        {
            searchModel.SearchObject = // Create type of T;
            // Some more code
            return View("SomeView", searchModel);
        }

然后我有一个强类型视图,它将SearchObject传递给局部视图。

 <% Html.RenderPartial(@"../Search/SearchCriteriaTemplates/" + /*Specific view name*/, Model.SearchObject); %>

然后,局部视图是强类型的,并且知道如何处理强类型模型。

答案 1 :(得分:1)

创建具有逻辑并返回Partials as string的辅助函数可能会产生相同的结果。并且将比RichardOD建议的虚拟功能具有更多的可移植性。