[英]Passing ViewData to ViewPage in 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"); %>
提前致谢
最好使用从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的源代码在这里 )。 但我敢肯定,在一般情况下你不需要这个。
我正在跟踪zihotki这个。 但是,对于#2,我会添加一个警告。 在默认实现中,使用neutered ASPX和ASCX作为视图,创建MVC控件(使用模板以确保您的狗被绝育)是最佳选择。
现在请注意。 ASPX和ASCX不一定是视图。 如果你看一下Phil Haack的博客,你会看到一些其他的视图引擎,比如Spark View引擎( 使用Spark View引擎的ASP.NET MVC Northwind Demo )。 实际上,Phil在此条目中设置了使用替代视图引擎的示例: 使用多个ViewEngines渲染单个视图 。
我不是建议你转移到其他视图引擎,只是有一个选项,如果你找到一个更适合你的问题域。 有时最好坚持开箱即用的实现。 在这种情况下,使用ASCX控件保持简单。
顺便说一下,如果你真的想要进入MVC作为你的UI故事, 你应该看看MVC的codeplex项目 。 这里最重要的可能是MVC.Contrib,但列表中还有一些其他宝石。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.