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

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

使用自定義ViewHelper來簡化Asp.net MVC view的開發------part3

2019-11-17 03:53:34
字體:
來源:轉載
供稿:網友
 接上篇…現在讓我們開始討論如何創建HtmlHelper擴展方法.

   在前面我們說到了創建HtmlText類的方方面面。包括為HtmlText創建的擴展方法.這些擴展方法包括直接被View調用的那些擴展方法。下面代碼展示了HtmlText的幾種不同的構造函數:

public static class HtmlHelperExtensions
{
    #region Textbox
    public static IViewObject NewText(
        this HtmlHelper htmlHelper, string name)
    {
        return NewText(htmlHelper, name, null);
    }
     
    public static IViewObject NewText(
        this HtmlHelper htmlHelper, string name, string labelText)
    {
        return NewText(htmlHelper, name, labelText, null);
    }
     
    public static IViewObject NewText(
        this HtmlHelper htmlHelper, string name, string labelText, object value)
    {
        return NewText(htmlHelper, name, labelText, value, null, false, true, null);
    }

    public static IViewObject NewText(
        this HtmlHelper htmlHelper, string name, string labelText, object value,  
        string validationMessage, bool @readonly, bool createLi, object attributes)
    {
        IViewObject viewObject = new HtmlText(
            new ViewRequestContext(htmlHelper), name, labelText, value,  
            validationMessage, @readonly, createLi, attributes);
        viewObject.StartView();
        return viewObject;
    }
    #endregion

    //NOTE: SOME CONTENT OMITTED FROM THIS SNipPET
}    NewText方法有四個不同版本的重載,這些重載都屬于System.Web.Mvc.HtmlHelper的擴展方法,只有最后一個方法用于真正的起作用,而其他的方法都是這個方法的封裝以便讓用戶使用起來更簡單.上面的代碼中HtmlText對象通過傳入適當的參數來初始化,而view是通過StartView方法來初始化,在StartView中被調用的HtmlText會返回合適的對象動態的將Html注入View.現在讓我們來看看如何在view中使用這些方法。

     前面我們已經創建了在View中可使用的HtmlText對象,現在就可以使用了。在前面我們提到,如果想要創建一個textbox來滿足Ricky的標準,我必須寫如下代碼:

<li>
    <label for="FirstName">First name</label>
    <%= Html.TextBox("FirstName") %>
    <%= Html.ValidationMessage("FirstName", "*") %>
</li>     現在通過使用HtmlHelper,我們可以把代碼簡化如下:

<% Html.NewText("FirstName", "First name"); %>     上面兩種方法所生成的Html是完全相同的,我們實現了前面設定的目標。從今往后就可以使用這個Helper來簡化asp.net MVC view的開發了。上面代碼中并沒有用到EndView方法.下面我們來研究一個更復雜一些的HTML的構造—radio button,看是如何實現的

     使用Asp.net MVC來創建一組radio button,代碼一般如下:

<li>
    <div class="option-group" id="GenderContainer">
        <label for="Gender">Gender</label>
        <% foreach (SelectListItem item in Model.GenderList)
           { %>
                <%= Html.RadioButton(item.Text, item.Value)%>
                <span><%= item.Text%></span>
        <% } %>
    </div>
</li>     上面代碼是從AddContactClass.aspx view中節選的,所有代碼可以從這篇文章的網站下載,上面代碼中ContactController通過Model.GenderList屬性來集中返回代碼:

public ActionResult AddContactClassic()
{
    AddContactModel addModel = InternalGetInitialAddModel();

    return View(addModel);
}

PRivate AddContactModel InternalGetInitialAddModel()
{
    string maleString = Gender.Male.ToString();
    string femaleString = Gender.Female.ToString();
     IList<SelectListItem> genderRadioButtons = new List<SelectListItem>()
    {
        new SelectListItem { Text = maleString, Value = maleString },
        new SelectListItem { Text = femaleString, Value = femaleString }
    };

    AddContactModel model = new AddContactModel { GenderList = genderRadioButtons };

    return model;
} 生成的HTML效果圖如下:



在上面創建radio button的代碼中有很多掩蓋了元素真實意圖(譯者按:比如說為什么我們這么寫HTML,是為了滿足Ricky的標準嗎?)的部分,比如說:外層的div和內層的span是為了label而包裹文本.而如果我們需要一組radio button時只需要聲明一下并指定相關的值那不是更爽嗎?下面我們創建HtmlRadioButtonGroup view helper,它可以滿足我們只聲明并指定相關值就能創建出相應的html,使用HtmlRadioButtonGroup,我們可以將前面的radio button精簡如下:

<% Html.NewRadioButtonGroup("Gender", Model.GenderList); %> 上面代碼中,我們可以從更高的視角來創建Html,清楚的這段代碼的作用而不是關注Html的細節。下面來創建一個替我們生成HTML的helper,也就是為:HtmlRadioButtonGroup類,下面代碼展示了這個類唯一的構造函數和它的字段:

private readonly List<SelectListItem> mSelectList;
private readonly bool mCreateLi;

public HtmlRadioButtonGroup(
    ViewRequestContext requestContext, string name,  
    IEnumerable<SelectListItem> selectList, bool createLi, object attributes)
    : base(requestContext, name)
{
    mSelectList = new List<SelectListItem>();
    if (selectList != null)
    {
        mSelectList.AddRange(selectList);
    }

    mCreateLi = createLi;
    Attributes = attributes;
}看上去是不是和我們先前的HtmlText對象的構造器很像?它的構造函數為通過傳參的方式將RequestContext變得可用。并且通過構造函數為所有的字段進行初始化,這也意味著這個類是在StartView方法中(譯者按:因為RequestContext方法在StartView中可以傳入)的,下面代碼是StartView的完全版本:

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

    TagBuilder liTagBuilder = new TagBuilder("li");
    if (mCreateLi)
    {
        httpResponse.Write(liTagBuilder.ToString(TagRenderMode.StartTag));
    }

    TagBuilder divTag = new TagBuilder("div");
    divTag.AddCSSClass("option-group");
    divTag.MergeAttribute("name", Name);
    if (Attributes != null)
    {
        divTag.MergeAttributes(new RouteValueDictionary(Attributes));
    }

    TagBuilder labelTag = new TagBuilder("label");
    labelTag.MergeAttribute("for", Name);
    labelTag.SetInnerText(Name);
    httpResponse.Write(labelTag.ToString(TagRenderMode.Normal));

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

    // Write out the radio buttons, let the MVC Helper do the hard work here
    foreach (SelectListItem item in this.mSelectList)
    {
        string text = !string.IsNullOrEmpty(item.Text)
                        ? item.Text
                        : item.Value;

        httpResponse.Write(RequestContext.HtmlHelper.RadioButton(
            Name, item.Value, item.Selected));

        // Note: Because we are using HtmlHelper.RadioButton the <input>  
        //       elements will have duplicate ids
        //       See: http://forums.asp.net/t/1363177.aspx
        //       In order to avoid this we could do this ourselves here
        TagBuilder spanTag = new TagBuilder("span");
        spanTag.SetInnerText(text);        
         httpResponse.Write(spanTag.ToString(TagRenderMode.Normal));
    }

    httpResponse.Write(divTag.ToString(TagRenderMode.EndTag));

    if (this.mCreateLi)
    {
        httpResponse.Write(liTagBuilder.ToString(TagRenderMode.EndTag));
    }
} 這里的想法和HtmlText類如初一撤,那就是:所有的HTML代碼都在StartView方法中生成。因此這里StartView方法創建了一些HTML tag,并遍歷mSelectList中的元素并通過Asp.net MVC自帶的RadioButton擴展方法為每一個元素生成一個RadioButton。在重用這些方法時最好先重寫這些方法(譯者按:看上面代碼注釋)。

從上面代碼中的注釋可以看出,使用HtmlHelper.RadioButton擴展方法有一個明顯的bug,就是id和name用的是同一個值,這里因為name屬性本來就應該為RadioButton設置成相同的這樣他們便可以邏輯上連成一組,但是id屬性是每個元素唯一擁有,這里解決這個bug的方法是不用這個方法,但在這里為了簡單起見我們先使用這個方法.上面創建的兩個Html helper對象都沒有用到EndView方法,你可以已經開懷疑這個方法為什么存在,在接下來的HtmlFieldSet的Helper我會給你展示EndView的用途

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

待續…

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

translated by CareySon


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲激情 国产| 国产精品视频公开费视频| 精品香蕉一区二区三区| 午夜免费日韩视频| 亚洲欧美激情四射在线日| 欧美最猛黑人xxxx黑人猛叫黄| 91在线色戒在线| 久久噜噜噜精品国产亚洲综合| 亚洲欧美日韩图片| 国产精品久久久久久久电影| 亚洲第一av网| 欧美激情欧美狂野欧美精品| xvideos亚洲人网站| 成人两性免费视频| 少妇高潮久久77777| 日韩黄在线观看| 欧美成人手机在线| 亚洲一区二区自拍| 成人av电影天堂| 精品国产户外野外| 久久国产精彩视频| 国产99视频在线观看| 国产精品免费视频久久久| 精品国产电影一区| 富二代精品短视频| 国产亚洲一区二区在线| 亚洲综合自拍一区| 欧美精品在线网站| 疯狂做受xxxx欧美肥白少妇| 日韩高清有码在线| 狠狠躁夜夜躁久久躁别揉| 亚洲自拍另类欧美丝袜| 国内成人精品一区| 午夜精品久久久久久99热软件| 亚洲国产日韩欧美在线99| 日韩成人久久久| 高跟丝袜一区二区三区| 最近2019中文字幕第三页视频| 久久6免费高清热精品| 91久久国产综合久久91精品网站| 91精品视频播放| 欧美性20hd另类| 亚洲图片欧美日产| 欧美xxxx18国产| 国产精品一区二区三区成人| 黑人巨大精品欧美一区免费视频| 91免费综合在线| 久久的精品视频| 国产精品一区二区久久久| 日韩电影免费在线观看中文字幕| 亚洲欧美国产另类| 亚洲嫩模很污视频| 91亚洲精品在线| 国产啪精品视频| 成人欧美一区二区三区黑人孕妇| 草民午夜欧美限制a级福利片| 久久精品中文字幕一区| 国模极品一区二区三区| 亚洲国产精品人久久电影| 欧美日韩中国免费专区在线看| 欧美视频免费在线| 亚洲精品av在线| 91香蕉嫩草影院入口| 中文字幕国内精品| 欧美性猛交xxxxx水多| 欧美wwwwww| 久久国内精品一国内精品| 色妞在线综合亚洲欧美| 亚洲自拍在线观看| 国产欧美韩国高清| 91高清视频免费观看| 欧美激情中文字幕在线| 久久久久久久久久久久av| 岛国精品视频在线播放| 久久精品视频中文字幕| 亚洲欧美一区二区激情| 91精品国产91久久久久久最新| 国产精品女主播| 日韩亚洲欧美成人| 午夜精品www| 91沈先生作品| 97久久伊人激情网| 国产91精品网站| 欧美国产精品va在线观看| 欧美午夜精品伦理| 日韩成人网免费视频| 中文字幕日韩精品有码视频| 成人免费看吃奶视频网站| 国产精品女主播视频| 日韩有码在线视频| 欧美视频在线观看免费| 亚洲黄页视频免费观看| 精品久久久久久中文字幕| 中文字幕在线观看日韩| 国产日韩一区在线| 精品国产鲁一鲁一区二区张丽| 91久久精品国产| 国内精久久久久久久久久人| 久久久av一区| 亚洲乱码一区二区| 精品国产依人香蕉在线精品| 国产精品美女主播在线观看纯欲| 国产精品久久久久久五月尺| 久久理论片午夜琪琪电影网| 一区二区欧美日韩视频| 欧美午夜影院在线视频| 日韩精品久久久久久久玫瑰园| 色悠悠国产精品| 亚洲性生活视频| 午夜剧场成人观在线视频免费观看| 国产视频在线一区二区| 国模视频一区二区| 亚洲男人天堂网站| 久久精品91久久香蕉加勒比| 97视频在线观看视频免费视频| 丝袜一区二区三区| 国产精品人人做人人爽| 97超碰国产精品女人人人爽| 欧美日韩在线第一页| 中文字幕免费精品一区| 在线视频日韩精品| 日韩精品欧美激情| 欧美大片在线看| 亚洲片国产一区一级在线观看| 亚洲精品日韩欧美| 久久亚洲国产精品成人av秋霞| 在线观看精品国产视频| 亚洲第一福利在线观看| 日韩专区在线播放| 亚洲裸体xxxx| 欧美日韩国产丝袜美女| 欧美电影在线观看网站| 中文字幕一区二区三区电影| 亚洲香蕉伊综合在人在线视看| 91影视免费在线观看| 久久精品国产久精国产一老狼| 91精品国产91久久久久久最新| 亚洲香蕉成人av网站在线观看| 久久九九热免费视频| 国内成人精品视频| 欧美精品久久久久久久久| 日韩在线观看免费全集电视剧网站| 久久久久女教师免费一区| 久久97精品久久久久久久不卡| 中文字幕av一区二区| 欧美性精品220| 成人免费黄色网| 久久久久久成人精品| 538国产精品一区二区免费视频| 91日韩在线播放| 亚洲女人天堂av| 欧美电影免费观看大全| 96国产粉嫩美女| 国产一区香蕉久久| 亚洲色图13p| 黄网动漫久久久| 久久综合国产精品台湾中文娱乐网| 亚洲aa在线观看| 日韩av在线免费观看一区| 亚洲香蕉av在线一区二区三区| 久久躁狠狠躁夜夜爽| 亚洲精选在线观看| 中文字幕日本精品| 国产精品av免费在线观看|