亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【譯】使用自定義ViewHelper來簡化Asp.net MVC view的開發------part4

2019-11-17 03:53:31
字體:
來源:轉載
供稿:網友
接上篇,我們下面通過HtmlFiledSet helper來展示何時使用EndView():

    如果你用asp.net已經有一段時間了,那使用Html.BeginForm helper來創建HTML form標簽的方式會讓你覺得有點怪.當你創建一個新的Asp.net mvc項目后,在View里的ChangePassWord.aspx會默認被創建,這個頁面使用了Html.BeginForm helper,下面是使用這個helper的代碼段:

<% using (Html.BeginForm()) { %>
    <div>
        <fieldset>
            <legend>Account Information</legend>
            <p>
                <label for="currentPassword">Current password:</label>
                <%= Html.Password("currentPassword") %>
                <%= Html.ValidationMessage("currentPassword") %>
            </p>
            <p>
                <label for="newPassword">New password:</label>
                <%= Html.Password("newPassword") %>
                <%= Html.ValidationMessage("newPassword") %>
            </p>
            <p>                 <label for="confirmPassword">Confirm new password:</label>
                <%= Html.Password("confirmPassword") %>
                <%= Html.ValidationMessage("confirmPassword") %>
            </p>
            <p>
                <input type="submit" value="Change Password" />
            </p>
        </fieldset>
    </div>
<% } %> 上面代碼中你會發現Html.BeginForm的使用和<%=Html.Password(“currentPassword”) %>的使用不盡相同,也就是Html.BeginForm在using語句中被調用,這點很有意思,讓我先來看看上面代碼段生成后的Html,如下:

<form  
  action="/Account/LogOn?ReturnUrl=%2fAccount%2fChangePassword"  
  method="post">
  <div>
    <fieldset>
      <legend>Account Information</legend>
      <p>
        <label for="username">Username:</label>
        <input id="username" name="username" type="text" value="" />   
      </p>
      <p>
        <label for="password">Password:</label>
        <input id="password" name="password" type="password" />   
      </p>
      <p>
        <input id="rememberMe" name="rememberMe" type="checkbox" value="true" />
        <input name="rememberMe" type="hidden" value="false" />
        <label class="inline" for="rememberMe">Remember me?</label>
      </p>
      <p>
        <input type="submit" value="Log On" />
      </p>
    </fieldset>
  </div>
</form> 比較<%= Html.Password("currentPassword") %> 語句和Html.BeginForm所生成的HTML代碼你會發現password那段僅僅僅僅將調用password擴展方法變成對應的Html,而BeginForm調用HTML擴展方法來注入form的開始標簽,<form…>,和using語句結束時(“}”)注入標簽<./form>.這種方式十分方便,因為我們可以一方面使用view helper創建合適的form標簽,另一方面在form標簽內插入任何我們想插入的html.這種方法的工作原理是當你調用Html.BeginForm方法并返回MvcForm類型的對象,這個對象在using語句中所以當對象被回收(譯者按:也就是Dispose)的時候,也就是執行到結尾的”<% } %>”時,關閉標簽</form>將會被寫入到View中.下面是Dispose方法的實現:

public void Dispose() {
    Dispose(true /* disposing */);
    GC.SupPRessFinalize(this);
}

protected virtual void Dispose(bool disposing) {
    if (!_disposed) {
        _disposed = true;
        _httpResponse.Write("</form>");
    }
} 我們用相似的方法來實現HtmlFieldSet:

從這篇文章附帶的代碼中有一個”DetailsClassic.aspx”頁面中,一些字段包含于fieldset元素中,具體代碼如下:

<fieldset class="details-field-group" name="Details">
  <legend>Details</legend>
  <ol>
    <li>
      <label for="FirstName">FirstName</label>
      <span id="FirstName">
        <%= Html.Encode(Model.FirstName) %></span>  
    </li>
    <li>
      <label for="LastName">LastName</label>
      <span id="LastName"><%= Html.Encode(Model.LastName) %></span>
    </li>
    <li>
      <label for="Email">Email</label>
      <span id="Email"><%= Html.Encode(Model.Email) %></span>
    </li>
    <li>
      <label for="Phone">Phone</label>
      <span id="Phone"><%= Html.Encode(Model.Phone) %></span>
    </li>
    <li>
      <label for="Gender">Gender</label>
      <span id="Gender"><%= Html.Encode(Model.Gender) %></span>
    </li>
  </ol>
</fieldset> 如果能用一個view helper來創建下面所有的html標簽,那會愜意很多:

fieldset的開始標記
legend標簽
ol的開始標簽
ol的結束標簽
fieldset的結束標簽
如果能用view helper來處理這些,那上面那段代碼無疑會簡單很多,尤其再加上使用Html.Text標簽來代替上面的text域。讓我們開始做到這一點,首先創建一個實現IViewObject接口的類,命名為HtmlFieldSet類并繼承與AbstractHtmlViewObject,整個類的代碼附下:

public class HtmlFieldset : AbstractHtmlViewObject
{
    private readonly string mTitle;

    public HtmlFieldset(
        ViewRequestContext requestContext, string name,  
        string title, object attributes)
        : base(requestContext, name)
    {
        mTitle = title;
        Attributes = attributes;
    }

    private TagBuilder FieldsetTag { get; set; }

    private TagBuilder OlTag { get; set; }

    public override void StartView()
    {
        HttpResponseBase httpResponse = RequestContext.HttpResponse;

        FieldsetTag = new TagBuilder("fieldset");

        // apply any Attributes passed in
        if (Attributes != null)
        {
            FieldsetTag.MergeAttributes(new RouteValueDictionary(Attributes));
        }  
        // The Name property should override any passed into the Attributes
        FieldsetTag.MergeAttribute("name", Name, true);

        httpResponse.Write(FieldsetTag.ToString(TagRenderMode.StartTag));

        if (!string.IsNullOrEmpty(mTitle))
        {
            TagBuilder legendTag = new TagBuilder("legend");
            legendTag.SetInnerText(mTitle);
            httpResponse.Write(legendTag.ToString(TagRenderMode.Normal));
        }

        OlTag = new TagBuilder("ol");
        httpResponse.Write(OlTag.ToString(TagRenderMode.StartTag));
    }

    public override void EndView()
    {
        HttpResponseBase httpResponse = RequestContext.HttpResponse;

        httpResponse.Write(OlTag.ToString(TagRenderMode.EndTag));
        httpResponse.Write(FieldsetTag.ToString(TagRenderMode.EndTag));
    }
} 這個類的實現和其它的view對象沒什么不同,除了EndView方法,在這里我們需要EndView方法來生成必須的結束標記。當然我們也可以使用EndView來生成任何需要的HTML,在這里我們僅是用它生成結束標記。

-------------------------------------------

待續…

原文鏈接:http://mvcviewhelpers.codeplex.com/

translated by CareySon

1 0 0
您已投過票
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产午夜一区二区| 精品一区二区三区四区| 国产日产久久高清欧美一区| 高清在线视频日韩欧美| 日韩69视频在线观看| 欧美日韩中文字幕日韩欧美| 色午夜这里只有精品| 欧美极品少妇xxxxⅹ免费视频| 欧美野外猛男的大粗鳮| 精品亚洲aⅴ在线观看| 国内精品久久久久久影视8| 中文字幕日韩欧美在线视频| 91po在线观看91精品国产性色| 欧美大片在线免费观看| 97国产真实伦对白精彩视频8| 国产裸体写真av一区二区| 久久午夜a级毛片| 精品小视频在线| 91精品国产乱码久久久久久久久| 欧美激情免费在线| 91精品久久久久久久久| 欧美精品久久久久久久久| 亚洲天堂免费视频| 亚洲欧洲高清在线| 97国产在线视频| 黑人精品xxx一区一二区| 欧美重口另类videos人妖| 精品久久久一区二区| 欧美中文字幕在线播放| 久久久久99精品久久久久| 亚洲欧美日韩高清| 韩国精品美女www爽爽爽视频| 国产精品久久久久免费a∨大胸| 国产精品老女人精品视频| 国产精品白嫩初高中害羞小美女| 日韩电影在线观看永久视频免费网站| 98视频在线噜噜噜国产| 国产精品美女久久久久av超清| 国产成人久久精品| 日韩精品免费在线| 国产精品99久久久久久人| 国产精品免费在线免费| 中文字幕亚洲国产| 亚洲黄色av女优在线观看| 91色p视频在线| 国产精品9999| 国产精品老女人视频| 久久久久久国产免费| 色偷偷av一区二区三区| 欧美黄网免费在线观看| 少妇高潮久久77777| 亚洲一区二区三区777| 宅男66日本亚洲欧美视频| 久久久精品2019中文字幕神马| 国产精品专区一| 好吊成人免视频| 91精品视频在线看| 色噜噜亚洲精品中文字幕| 亚洲视频网站在线观看| 欧美一级在线亚洲天堂| 精品日本高清在线播放| 91中文在线观看| 欧美精品www| 美女福利精品视频| 色久欧美在线视频观看| 91成品人片a无限观看| 欧美成人精品在线视频| 国产日韩在线播放| 国产精品视频久久| 欧美又大粗又爽又黄大片视频| 国产亚洲精品高潮| 97视频免费在线看| 国产精品久久久久久久美男| 少妇精69xxtheporn| 色综合视频一区中文字幕| 欧美激情综合色综合啪啪五月| 亚洲激情国产精品| 亚洲国产精品va在线看黑人| 日韩精品极品在线观看播放免费视频| 国产69精品久久久久9| 国产精品美女视频网站| 91精品国产色综合久久不卡98口| 欧美日韩一区二区在线播放| 亚洲成人激情小说| 91日本在线视频| 国产日韩av高清| 国产有码一区二区| 久久久久久伊人| 国产精品九九久久久久久久| 久久久久国产精品www| 欧美影院久久久| 色综合久久精品亚洲国产| 欧美精品免费在线观看| 国产美女91呻吟求| 国产精品r级在线| 亚洲三级黄色在线观看| 久久精品国产免费观看| 亚洲偷欧美偷国内偷| 黑人巨大精品欧美一区二区免费| 中文字幕九色91在线| 96pao国产成视频永久免费| 亚洲va电影大全| 欧美丰满老妇厨房牲生活| 国产婷婷97碰碰久久人人蜜臀| 欧美成人精品三级在线观看| 一色桃子一区二区| 久久精品欧美视频| 国产区亚洲区欧美区| 日韩小视频在线| 久久精品电影网| 日本久久久久久| 色婷婷久久av| 91精品国产91久久久久久| 国产精品美女免费视频| 欧美色道久久88综合亚洲精品| 精品久久久av| 色在人av网站天堂精品| 91地址最新发布| 欧美成人性生活| 亚洲欧洲偷拍精品| 日韩福利在线播放| 欧美性理论片在线观看片免费| 久久青草精品视频免费观看| 成人黄色影片在线| 日韩美女视频免费看| 欧美精品在线观看91| 久久91精品国产91久久跳| 91丨九色丨国产在线| 亚洲一区二区三区视频| 中文字幕成人精品久久不卡| 九九九久久久久久| 国产成人精彩在线视频九色| 欧美体内谢she精2性欧美| 日韩在线观看电影| 日韩欧美在线免费观看| 日韩激情在线视频| 亚洲久久久久久久久久久| 亚洲va欧美va在线观看| 欧美日韩中文字幕综合视频| 国产91精品黑色丝袜高跟鞋| 亚洲女在线观看| 亚洲欧美国产精品va在线观看| 久久久精品欧美| 97国产精品视频人人做人人爱| 热久久视久久精品18亚洲精品| 国产精品久久久亚洲| 成人黄色片网站| 亚洲天堂av在线免费观看| 精品香蕉一区二区三区| 一区二区三区高清国产| 91精品国产91久久久| 亚洲xxx视频| 日韩av不卡在线| 久久久成人的性感天堂| 成人久久精品视频| 久久6免费高清热精品| 欧美在线视频导航| 精品调教chinesegay| 欧美大片免费看| 亚洲欧美在线x视频| 国产一区二区av| 国内精品模特av私拍在线观看| 久久视频国产精品免费视频在线| 亚洲国内精品视频|