我正在尝试在ASP.NET MVC中构建一个自定义控件。我想避免的是在这些控件中混合视图(html)和代码(C#)。
在对这个问题进行了数小时的搜索和斗争之后,我终于想到了创建使用ASP视图引擎的助手方法,并考虑了ViewPage类。
我能够创建类的一个实例,甚至可以使用LoadControl和LoadTemplate方法加载ascx模板,但问题是,当我将ViewData对象传递给ViewPage类的实例时,我无法在ViewPage中看到ViewData,并且得到了这个错误:
'~/Components/Controls/EditableLabel/Views/EditableLabel.ascx‘ViewUserControl无法找到IViewDataContainer。ViewUserControl必须位于ViewPage、ViewMasterPage或另一个ViewUserControl中。
通常,我想要达到的最终效果是加载带有一些参数的控件,这些参数应该在模板(ascx)中可读。
示例:
<% Html.EditableLabel(Writer, "memberName", "Name", "Antonio", "/identity/updateProperty", "memberName"); %>提前感谢
发布于 2009-02-21 05:13:03
以及可以在FooViewData类中定义的所有必要参数。
如果您真的想要为HtmlHelper编写一个扩展,它将加载一些ascx控件,那么您应该看看MvcFutures中的Repeater类( MVC的源代码是这里)。但我相信在普通情况下你不需要这个。
发布于 2009-02-21 13:46:55
我正在和齐霍奇一起追踪这件事。然而,在第二条中,我将添加一个警告。在默认的实现中,使用中性的ASPX和ASCX作为视图,创建MVC控件(使用模板确保您的狗被中性化)是最好的选择。
现在听我的警告。ASPX和ASCX不必是视图。如果您查看Phil的博客,您将看到提到的其他视图引擎,比如Spark (使用星火视图引擎的ASP.NET MVC Northwind演示)。事实上,菲尔已经在这个条目中设置了一个使用替代视图引擎的示例:使用多个ViewEngines呈现单个视图。
我并不是建议您转移到其他视图引擎,只是有一个选项,如果您找到一个更适合您的问题领域。有时,最好还是坚持“开箱即用”的实现。在本例中,使用ASCX控件保持简单。
顺便说一句,如果你真的把MVC作为你的UI故事,您应该看看MVC的codeplex项目。。这里最重要的可能是MVC.Contrib,但是列表中还有其他一些宝石。
https://stackoverflow.com/questions/572268
复制相似问题