【问题标题】:Passing ViewData to ViewPage in ASP.NET MVC在 ASP.NET MVC 中将 ViewData 传递给 ViewPage
【发布时间】:2009-02-21 04:21:37
【问题描述】:

我正在尝试在 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 中创建自定义控件/小部件?

提前致谢

【问题讨论】:

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


    【解决方案1】:
    1. 您可以通过“return View(...)”或“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); %>
      

    以及您可以在 FooViewData 类中定义的所有必要参数。

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

    【讨论】:

    • 如果使用防护,通过VD的可能性会大大降低
    • “保护”是什么意思,为什么会减少?控件可以使用值绑定,因此它们将能够从 ViewDataDictionary 或模型加载值。
    【解决方案2】:

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

    现在要注意了。 ASPX 和 ASCX 不必是视图。如果您查看 Phil Haack 的博客,您会看到提到的其他一些视图引擎,例如 Spark 视图引擎 (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,但列表中还有一些其他的 gem。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-19
      • 2012-01-22
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多