接上文..前面我们已经创建好了HtmlFieldSet,现在,为了让HtmlHelper的扩展方法可以使用这个类 ,还需要创建一个方法:NewHtmlFieldSet
public static IViewObject NewHtmlFieldSet(
this HtmlHelper htmlhelper, string name, string title, object attributes)
{
IViewObject viewObject = new HtmlFieldSet(
new ViewRequestContext(htmlhelper), name, title, attributes);
viewObject.StartView();
return viewObject;
}
这个方法的实现和前面所提到的那些没有上面不同,都是传入相应参数并返回view object,在View被 初始化时返回这个对象,View首先在初始化时使用返回的View object,更确切点说,返回的IViewObject 会在using语句中被view使用,例子如下:
<% using (Html.NewHtmlFieldset("FieldsetName", "My Fieldset", null))
{ %>
<li>
<label for="FirstName">FirstName</label>
<span id="FirstName"><%= Html.Encode(Model.FirstName) %></span>
</li>
<% } %>
对应生成的HTML代码如下:
<fieldset name="FieldsetName">
<legend>My Fieldset</legend>
<ol>
<li>
<label for="FirstName">FirstName</label>
<span id="FirstName">Sayed</span>
</li>
</ol>
</fieldset>
EndView方法输出了最后的三个结尾标签(</li>,</ol>,</fieldset>),达到了 我们的预期,现在就可以使用view helper来创建fieldset以及包含在内的legend,以便达到更好的可理解 和可维护性。下面来看view helper是如何简化view的开发的。
这篇文章中附带的示例代码时全功能版本,每一个页面都有两个版本-使用view helper和不使用view helper.不适用view helper的版本全部手动创建HTML,而使用view helper的版本包括了我们先前创建的3 个view helper,让我们来进行简单的比较,从源码中找到AddContactClassic.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<Sedodream.Web.ViewHelper.Models.AddContactModel>"
%>
<%@ Import Namespace="Sedodream.Web.Common.Contact" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Add Contact Classic
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Add Contact Classic</h2>
<%= Html.ValidationSummary("Errors exist") %>
<ol> <li>
<span class="success-message"><%= ViewData["SuccessMessage"]% ></span>
</li>
</ol>
<% using (Html.BeginForm())
{ %>
<fieldset>
<legend>Account Information</legend>
<ol>
<li>
<label for="FirstName">First name</label>
<%= Html.TextBox
|