2011-06-28 90 views
0

我想创建一个HtmlHelper扩展方法,它允许你设置模型实例,然后绑定这个模型的属性来渲染一些html。HtmlHelper绑定模型属性。 Fluent Interface

这将会跟在Telerik Grid附近的类似模式。

在以下示例中,我们看到我们将Model设置为网格的DataContext。 然后声明一些列。 Foreach专栏中,他们将模型绑定到IEnumerable。因此,当网格呈现行时,相应的属性将从该行的模型实例绑定。

@(Html.Telerik().Grid(Model) 
     .Name("Grid") 
     .Columns(columns => 
     { 
      columns.Bound(o => o.OrderID).Width(100); 
      columns.Bound(o => o.ContactName).Width(200); 
      columns.Bound(o => o.ShipAddress); 
      columns.Bound(o => o.OrderDate).Format("{0:MM/dd/yyyy}").Width(120); 
     }) 
     .Scrollable(scrolling => scrolling.Enabled((bool)ViewData["scrolling"])) 
     .Sortable(sorting => sorting.Enabled((bool)ViewData["sorting"])) 
) 

基本上,我想就如何实施Bound方法的想法。对于我的情况,该模型也将是IEnumerable。所以可以说我有一个模型,它是List<MyObj>

为了讨论起见,MyObj看起来是这样的:

public class MyObj 
{ 
    public bool IsRegistered { get; set;} 
    public string Name { get; set; } 
} 

我想最终在视图中调用一个会使我的名单,并期待一个的HtmlHelper这样的事情:

@(Html.MyHelpers().MyList(Model) 
        .ControlOne.Bound(o => o.IsRegistered) 
        .ControlTwo.Bound(o => o.Name) 
) 

我还没有尝试过很多,说实话我不知道如何实现这一点。所以我会发布更新,因为这将是一项正在进行的工作。但是,如果有任何想法或建议,我将不胜感激。我知道我可以使用网格,但这个帮助器的重量更轻,因为我不需要太多的功能,也不想为此目的拖动telerik网格。

谢谢!

回答

0

一些开源项目有你有一个看看源代码Html.DisplayForModel()(因为ASP.NET MVC是开源的)?也许它会给你一些线索。对于ASP.NET MVC 3 RTM

源代码是在这里:http://aspnet.codeplex.com/releases/view/58781

你需要看看是DisplayExtensions.csTemplateHelpers.csmvc3-rtm-sources\mvc3\src\SystemWebMvc\Mvc\Html

点的位是,你已经可以用Html.DisplayForModel()渲染控制你的模型的每个属性,你可以通过查看源代码来了解它是如何完成的,所以你可以轻松地调整它。

还有EditorExtensions.cs其中包含Html.EditorForModel()它给你编辑版本。

关于ASP.NET MVC的重要之处在于,您可以将它的任何部分换掉并编写自己的代码,这样您就可以实现任何功能。