在Windows MVC中将ViewData传递给ViewPage

时间:2009-02-21 04:21:37

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

我正在尝试在ASP.NET MVC中构建自定义控件。我想避免的是在这些控件中混合视图(html)和代码(C#)。

经过几个小时的谷歌搜索和挣扎于这个问题,我终于想到了创建使用ASP视图引擎认为ViewPage类的帮助方法。

我能够创建类的实例,甚至可以使用LoadControl和LoadTemplate方法加载ascx模板,但问题是当我将ViewData对象传递给ViewPage类的实例时,我无法在ViewPage中看到ViewData我收到了这个错误:

  

ViewUserControl'〜/ Components / Controls / EditableLabel / Views / EditableLabel.ascx'找不到IViewDataContainer。 ViewUserControl必须位于ViewPage,ViewMasterPage或其他ViewUserControl中。

一般来说,我想要实现的最终效果是使用一些参数加载控件,这些参数应该在模板中可读(ascx)。

示例:

<% Html.EditableLabel(Writer, "memberName", "Name", "Antonio", "/identity/updateProperty", "memberName"); %>
  1. 有没有办法将ViewData传递给我创建的ViewPage实例?
  2. 是否有更智能的方法在ASP.NET MVC中创建自定义控件/小部件?
  3. 提前致谢

2 个答案:

答案 0 :(得分:2)

  1. 您可以通过“返回视图(...)”或“ViewData [name] = value”将VD传递给控制器​​的VP。
  2. 最好使用从ViewUserControl继承的ascx控件来创建自定义控件。通过这种方式,您可以轻松地将数据传递给它:

    <% Html.RenderPartial("FooControl", new FooViewData(){ Name="aa",  Type="awesome", Id = 2}); %>
    <% Html.RenderPartial("FooControl", new FooViewData(){ Name="aa", Type="awesome", Id = 2}, ViewData); %>
    
  3. 您可以在FooViewData类中定义所有必要的参数。

    如果你真的想写一个HtmlHelper的扩展,它将加载一些ascx控件,你应该看看MvcFutures中的Repeater类(MVC的源是here)。但我敢肯定,在一般情况下你不需要这个。

答案 1 :(得分:2)

我正在跟踪zihotki。但是,对于#2,我会添加一个警告。在默认实现中,使用neutered ASPX和ASCX作为视图,创建MVC控件(使用模板确保您的狗被绝育)是最佳选择。

现在请注意。 ASPX和ASCX不一定是视图。如果你看一下Phil Haack的博客,你会看到一些其他的视图引擎,比如Spark View引擎(ASP.NET MVC Northwind Demo Using the Spark View Engine)。实际上,Phil在此条目中设置了使用替代视图引擎的示例:Rendering A Single View Using Multiple ViewEngines

我不是建议你转移到其他视图引擎,只是有一个选项,如果你找到一个更适合你的问题域。有时最好坚持开箱即用的实现。在这种情况下,使用ASCX控件保持简单。

顺便说一句,如果你真的很想进入MVC作为你的UI故事,you should look at the codeplex projects for MVC。这里最重要的可能是MVC.Contrib,但列表中还有一些其他的宝石。