我正在尝试在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"); %>
提前致谢
答案 0 :(得分: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)。但我敢肯定,在一般情况下你不需要这个。
答案 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,但列表中还有一些其他的宝石。