最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > asp教程

自定义ViewHelper来简化Asp.net MVC

日期:08-28    来源:中国设计秀    作者:cnwebshow.com

   接上文..前面我们已经创建好了HtmlFieldSet,现在,为了让HtmlHelper的扩展方法可以使用这个类,还需要创建一个方法:NewHtmlFieldSetQnH中国设计秀
QnH中国设计秀
public static IViewObject NewHtmlFieldSet( QnH中国设计秀
    this HtmlHelper htmlhelper, string name, string title, object attributes) QnH中国设计秀
{ QnH中国设计秀
    IViewObject viewObject = new HtmlFieldSet( QnH中国设计秀
        new ViewRequestContext(htmlhelper), name, title, attributes); QnH中国设计秀
    viewObject.StartView(); QnH中国设计秀
    return viewObject; QnH中国设计秀
}     这个方法的实现和前面所提到的那些没有上面不同,都是传入相应参数并返回view object,在View被初始化时返回这个对象,View首先在初始化时使用返回的View object,更确切点说,返回的IViewObject会在using语句中被view使用,例子如下:QnH中国设计秀
QnH中国设计秀
<% using (Html.NewHtmlFieldset("FieldsetName", "My Fieldset", null)) QnH中国设计秀
   { %> QnH中国设计秀
    <li> QnH中国设计秀
      <label for="FirstName">FirstName</label> QnH中国设计秀
      <span id="FirstName"><%= Html.Encode(Model.FirstName) %></span>  QnH中国设计秀
    </li> QnH中国设计秀
<% } %>     对应生成的HTML代码如下:QnH中国设计秀
QnH中国设计秀
<fieldset name="FieldsetName"> QnH中国设计秀
  <legend>My Fieldset</legend> QnH中国设计秀
  <ol> QnH中国设计秀
      <li> QnH中国设计秀
        <label for="FirstName">FirstName</label> QnH中国设计秀
        <span id="FirstName">Sayed</span>  QnH中国设计秀
      </li> QnH中国设计秀
  </ol> QnH中国设计秀
</fieldset> QnH中国设计秀
EndView方法输出了最后的三个结尾标签(</li>,</ol>,</fieldset>),达到了我们的预期,现在就可以使用view helper来创建fieldset以及包含在内的legend,以便达到更好的可理解和可维护性。下面来看view helper是如何简化view的开发的。QnH中国设计秀
QnH中国设计秀
这篇文章中附带的示例代码时全功能版本,每一个页面都有两个版本-使用view helper和不使用view helper.不适用view helper的版本全部手动创建HTML,而使用view helper的版本包括了我们先前创建的3个view helper,让我们来进行简单的比较,从源码中找到AddContactClassic.aspxQnH中国设计秀
QnH中国设计秀
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"  QnH中国设计秀
  Inherits="System.Web.Mvc.ViewPage<Sedodream.Web.ViewHelper.Models.AddContactModel>" QnH中国设计秀
%> QnH中国设计秀
QnH中国设计秀
<%@ Import Namespace="Sedodream.Web.Common.Contact" %> QnH中国设计秀
QnH中国设计秀
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> QnH中国设计秀
  Add Contact Classic QnH中国设计秀
</asp:Content> QnH中国设计秀
QnH中国设计秀
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> QnH中国设计秀
  <h2>Add Contact Classic</h2> QnH中国设计秀
  <%= Html.ValidationSummary("Errors exist") %> QnH中国设计秀
   QnH中国设计秀
  <ol>     <li> QnH中国设计秀
      <span class="success-message"><%= ViewData["SuccessMessage"]%></span> QnH中国设计秀
      </li> QnH中国设计秀
  </ol> QnH中国设计秀
  <% using (Html.BeginForm()) QnH中国设计秀
     { %> QnH中国设计秀
      <fieldset> QnH中国设计秀
        <legend>Account Information</legend> QnH中国设计秀
        <ol> QnH中国设计秀
          <li> QnH中国设计秀
            <label for="FirstName">First name</label> QnH中国设计秀
            <%= Html.TextBox("FirstName") %> QnH中国设计秀
            <%= Html.ValidationMessage("FirstName", "*") %> QnH中国设计秀
          </li> QnH中国设计秀
          <li> QnH中国设计秀
            <label for="LastName">Last name</label> QnH中国设计秀
            <%= Html.TextBox("LastName") %> QnH中国设计秀
            <%= Html.ValidationMessage("LastName", "*") %> QnH中国设计秀
          </li> QnH中国设计秀
          <li> QnH中国设计秀
            <label for="Email">Email</label> QnH中国设计秀
            <%= Html.TextBox("Email")%> QnH中国设计秀
            <%= Html.ValidationMessage("Email", "*")%> QnH中国设计秀
          </li> QnH中国设计秀
          <li> QnH中国设计秀
            <label for="Phone">Phone</label> QnH中国设计秀
            <%= Html.TextBox("Phone")%> QnH中国设计秀
            <%= Html.ValidationMessage("Phone", "*")%> QnH中国设计秀
          </li> QnH中国设计秀
          <li> QnH中国设计秀
            <div class="option-group" id="GenderContainer"> QnH中国设计秀
              <label for="Gender">Gender</label> QnH中国设计秀
              <% foreach (SelectListItem item in Model.GenderList) QnH中国设计秀
                 { %> QnH中国设计秀
                   <%= Html.RadioButton(item.Text, item.Value)%> QnH中国设计秀
                   <span><%= item.Text%></span> QnH中国设计秀
              <% } %> QnH中国设计秀
            </div> QnH中国设计秀
          </li> QnH中国设计秀
           QnH中国设计秀
          <li> QnH中国设计秀
            <input type="submit" value="Add contact" /> QnH中国设计秀
          </li> QnH中国设计秀
        </ol> QnH中国设计秀
      </fieldset> QnH中国设计秀
  <% } %> QnH中国设计秀
</asp:Content> 上面代码尽管简单,但仍然包含多达59行代码,而且看起来十分丑陋,下面的版本是使用我们自定义的view helper,让我们来看看包含在AddContactNew.aspx内的新版本:QnH中国设计秀
QnH中国设计秀
<%@ Page QnH中国设计秀
Inherits="System.Web.Mvc.ViewPage<Sedodream.Web.ViewHelper.Models.AddContactModel>" QnH中国设计秀
    Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Title="" %> QnH中国设计秀
QnH中国设计秀
<%@ Import Namespace="Sedodream.Web.Common.View" %> QnH中国设计秀
QnH中国设计秀
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> QnH中国设计秀
  Add Contact New QnH中国设计秀
</asp:Content> QnH中国设计秀
QnH中国设计秀
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> QnH中国设计秀
QnH中国设计秀
    <h2>Add Contact New</h2> QnH中国设计秀
     QnH中国设计秀
    <%= Html.ValidationSummary("Errors exist") %> QnH中国设计秀
     QnH中国设计秀
    <ol> QnH中国设计秀
      <li> QnH中国设计秀
        <span class="success-message"><%= Model.SuccessMessage %></span> QnH中国设计秀
      </li> QnH中国设计秀
    </ol> QnH中国设计秀
    <% using (Html.BeginForm()) QnH中国设计秀
       { %> QnH中国设计秀
    <fieldset> QnH中国设计秀
        <legend>Account Information</legend> QnH中国设计秀
        <ol> QnH中国设计秀
            <% Html.NewText("FirstName", "First name"); %> QnH中国设计秀
            <% Html.NewText("LastName", "Last name"); %> QnH中国设计秀
            <% Html.NewText("Email", "Email"); %> QnH中国设计秀
            <% Html.NewText("Phone", "Phone"); %> QnH中国设计秀
            <% Html.NewRadioButtonGroup("Gender", Model.GenderList); %> QnH中国设计秀
             QnH中国设计秀
            <li> QnH中国设计秀
                <input type="submit" value="Add contact" /> QnH中国设计秀
            </li> QnH中国设计秀
        </ol> QnH中国设计秀
     QnH中国设计秀
    </fieldset> QnH中国设计秀
    <% } %> QnH中国设计秀
</asp:Content>  QnH中国设计秀
QnH中国设计秀
QnH中国设计秀
使用view helper的版本html大大减少(只有39行)而且更容易理解,这里需要注意view引入了Sedodream.Web.Common.View命名空间,这使view helper扩展方法所必须的.Sedodream.Web.Common.View命名空间包含在另一个程序集中,这样更方便你在整个小组内进行分发,使用View helper所带来的可理解性只是使用它所带来好处的其中之一,它还会带来以下好处:QnH中国设计秀
QnH中国设计秀
View更清爽,更容易理解 QnH中国设计秀
小组内遵循某些标准更容易 QnH中国设计秀
在修改时需要改变的地方更少 QnH中国设计秀
可利用回传的model state辅助生成代码 QnH中国设计秀
在前面我们提到了GetModelStateValue方法的使用。这个方法用于给HTML元素赋上它自己从View里回传的值,而在view helper内可以给生成的html元素赋值.下面代码片段是System.Web.Mvc.Html.InputExtensions源文件中的一部分,这里用来展示GetModelStateValue的用法:QnH中国设计秀
QnH中国设计秀
case InputType.Radio: QnH中国设计秀
    if (!usedModelState) { QnH中国设计秀
        string modelStateValue = htmlHelper.GetModelStateValue( QnH中国设计秀
            name, typeof(string)) as string; QnH中国设计秀
        if (modelStateValue != null) { QnH中国设计秀
            isChecked = String.Equals( QnH中国设计秀
                modelStateValue, valueParameter, StringComparison.Ordinal); QnH中国设计秀
            usedModelState = true; QnH中国设计秀
        } QnH中国设计秀
    } 上面代码先检查model state来看radio button是否被创建,如果radio button已经存在就可以查看radio button是否已经被选中,当你创建自定义view helper时,你最好也在合适的地方支持类似(可以获取当前html的元素)的功能。前面的HtmlText view helper已经说明了这一点。QnH中国设计秀
QnH中国设计秀
QnH中国设计秀
QnH中国设计秀
文章到此已经将创建自定义view helper的方方面面都讲到了。QnH中国设计秀

本文引用地址:/bc/article_46173.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明