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

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

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

2019-11-17 03:53:34
字體:
來源:轉載
供稿:網友
   接上篇…首先讓我們來看如何創建一個我們先前討論的textbox

     我們已經知道需要創建的textbox有一個文本值與之對應:

文本值在label標簽中
可選的值放在Textbox中
可選的驗證信息(validation message)
      如果上面3個條件都能滿足,肯定也能滿足我們在part1里的那5個條件.還有一些錦上添花的是可以通過屬性來指定textbox是否包裹在li標簽內以及textbox是否是readonly模式.這樣我們便能更好的在view page中代碼復用。下面的代碼包含所有HtmlText(譯者按:繼承AbstractHtmlViewObject對象,在part1的類圖中)對象所有的屬性:

PRivate readonly string mLabelText;
private readonly bool mCreateLabel;
private readonly object mValue;
private readonly string mValidationMessage;
private readonly bool mCreateValidationMessage;
private readonly bool mCreateLi;
private readonly bool mReadonly;

public HtmlText(
    ViewRequestContext requestContext, string name, string labelText, objec
    string validationMessage, bool @readonly, bool createLi, object attribu
    : base(requestContext, name)
{
    mLabelText = labelText;
    mCreateLabel = !string.IsNullOrEmpty(mLabelText);
    mValidationMessage = validationMessage;
    mCreateValidationMessage = !string.IsNullOrEmpty(validationMessage);
    mCreateLi = createLi;
    mReadonly = @readonly;
    Attributes = attributes;

    object valueToAssign = value;
    if (valueToAssign == null)
    {
        // see if the ModelState has a value for this
        valueToAssign = GetModelStateValue(name, typeof(string));
    }

    mValue = valueToAssign;
}      在構造函數中,我們我們存入一系列私有變量中并初始化了會在StartView方法內使用的一個bool類型,除此之外你可以發現這里開始使用GetModelStateValue方法.目前為止我們先不過多討論這個方法,這個方法會在后面提到。在參數傳入構造器之前我們注意到:

value參數的類型是object
object類型的attributes參數被傳入
    之所以把Value參數定義為object類型是因為這樣可以使用戶更容易使用并且和asp.net MVC Helpers的執行方式保持一致。attributes參數可以被調用者來擴展生成的HTML。比如說,你想將textbox的maxlength屬性設置為5,你只需要傳入匿名類型”new {maxlength=5}“.input標簽會將這個匿名類型轉換為HTML屬性maxlength=5.這同時也符合Asp.net MVC中HTML Helper現有擴展方法的使用方式.每一個View helper對象都應該支持這種行為以便具有更大的靈活性.在這個類中剩下的兩個方法就是從父類繼承來的StartView和EndView方法了.

     StartView和EndView的定義如下:

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

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

    // write out label if provided
    if (mCreateLabel)
    {
        TagBuilder labelTag = new TagBuilder("label");
        labelTag.Attributes.Add("for", Name);
        labelTag.SetInnerText(mLabelText);
        httpResponse.Write(labelTag.ToString(TagRenderMode.Normal));
    }

    string stringValue = string.Empty;
    if (this.mValue != null)
    {
        stringValue = Convert.ToString(this.mValue, CultureInfo.CurrentCulture);
    }

    if (this.mReadonly)
    {
        TagBuilder textTag = new TagBuilder("span");         
        textTag.AddCSSClass("readonly-text");
        textTag.SetInnerText(
            Convert.ToString(this.mValue, CultureInfo.CurrentCulture));
        httpResponse.Write(textTag.ToString(TagRenderMode.Normal));
    }
    else
    {
        // Use MVC helpers to create the actual text box
        httpResponse.Write(RequestContext.HtmlHelper.TextBox(
            Name, this.mValue, Attributes));
    }

    if (this.mCreateLi)
    {
        httpResponse.Write(htmlLiTagBuilder.ToString(TagRenderMode.EndTag));
    }
}
public override void EndView()
{
    // Not needed for this element
}

     在StartView方法中有很多值得注意的地方,讓我們逐個討論。首先是我們使用System.Web.Mvc.TagBuilder來生成HTML,而不是直接寫HTML標簽。TagBuilder只能在Asp.net MVC中使用并且我推薦在生成HTML中必須使用TagBuilder而不是直接寫HTML標簽,下面是TagBuilder的類圖:



    

下表是TagBuilder中一些方法的說明:

名稱 描述
AddCssClass 加入css的class名稱,如果class已經存在,則后來加入的會和原來的class一起生效
MergeAttribute 這個方法用于添加或者更新tag的屬性,這個方法有一個接受replaceExisting參數的重載,默認情況下已經定義的屬性不會被重載。
MergeAttributes 同上,只是可以在一個方法內添加或更新所有屬性.
SetInnerText 設置標簽內的文本
ToString 被重載。用于生成相應的html代碼,TagRenderMode枚舉類型會控制如何生成HTML標簽.



在上面表格的ToString那行,TagRenderMode枚舉用于控制TagBuilder生成HTML標簽的方式,TagRenderModel如下所示:

TagRenderModel 結果示例
Normal <div name=”Sample01”>Some content here</div>
StartTag <div name=”Sample01”>
EndTag </div>  
SelfClosing <div name=”Sample01” />
    



    根據你想創建的HTML標簽和你如何使用它,你會發現使用TagRenderModel可以創建出任何你想創建出的HTML.在前面提到的StartView方法內你會發現TagRenderModel被依據不同的條件設置成StartTag,Normal和EndTag等不同的的類型.如果你給InnerHTML屬性賦值并用StartTag和EndTag生成它你必須要記住InnerHtml不會被自動生成,你還必須顯式的使用InnerHtml屬性本身。下面我們來討論如何創建HtmlHelper擴展方法。

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

待續…

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

translated by CareySon


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品久久久久中文字幕二区| 亚洲精品国产美女| 在线电影欧美日韩一区二区私密| 热久久这里只有精品| 欧美精品一区二区免费| 亚洲欧洲日韩国产| 狠狠爱在线视频一区| 欧美孕妇毛茸茸xxxx| 亚洲欧美日韩国产中文专区| 欧美激情欧美激情在线五月| 日韩欧美中文第一页| www.日韩不卡电影av| 91av在线精品| 亚洲va欧美va国产综合久久| 亚洲国产成人在线播放| 青青久久av北条麻妃海外网| 国产日韩精品一区二区| 欧美日本在线视频中文字字幕| 91日本在线视频| 最近的2019中文字幕免费一页| 91亚洲va在线va天堂va国| 亚洲人成网站在线播| 91高清视频免费| 欧美精品久久久久久久久久| 国产福利视频一区二区| 久久精品亚洲94久久精品| 亚洲欧美激情一区| 在线亚洲欧美视频| 精品国产欧美一区二区三区成人| 亚洲欧美一区二区三区四区| 最近2019中文字幕大全第二页| 国产精品1区2区在线观看| 色妞一区二区三区| 亚洲色图av在线| 深夜成人在线观看| 最新国产精品拍自在线播放| 福利视频一区二区| 亚洲国产日韩欧美在线图片| 国产精品对白刺激| 欧美激情欧美激情在线五月| 亚洲国产精品va在看黑人| 国产精品久久国产精品99gif| 91精品久久久久久久久久入口| 日韩在线观看成人| 国产一区二区三区视频在线观看| 国内成人精品一区| 久久久国产在线视频| www.亚洲一二| 精品国产区一区二区三区在线观看| 欧美激情视频在线观看| 国产女人18毛片水18精品| 亚洲自拍偷拍色片视频| 97国产在线视频| 亚洲成人av片在线观看| 尤物九九久久国产精品的特点| 亚洲欧美一区二区激情| 久热99视频在线观看| 精品久久久久久中文字幕大豆网| 国产精品视频资源| 国产精品啪视频| 国产一区在线播放| 中文字幕精品www乱入免费视频| 91国偷自产一区二区三区的观看方式| 欧美激情二区三区| 亚洲另类xxxx| 日韩av影视综合网| 日本精品视频在线播放| 91色在线观看| 日韩精品在线观看视频| 97精品国产97久久久久久春色| 4438全国成人免费| 久久久精品一区二区| 欧美激情伊人电影| 日韩电影中文字幕| 国产精品入口日韩视频大尺度| 国产欧美日韩高清| 91久热免费在线视频| 亚洲欧美国产精品久久久久久久| 国产91|九色| 精品无人区乱码1区2区3区在线| 日韩免费在线看| 国产一区二区激情| 欧美成人免费视频| 丝袜一区二区三区| 疯狂做受xxxx欧美肥白少妇| 91精品国产综合久久香蕉的用户体验| 中文字幕国产亚洲2019| 国产美女精品视频免费观看| 久久精品国产91精品亚洲| 在线色欧美三级视频| 91久久精品美女| 欧美与黑人午夜性猛交久久久| 在线播放国产一区中文字幕剧情欧美| 5278欧美一区二区三区| 日本在线精品视频| 亚洲黄色成人网| 亚洲美女视频网| 国产成人精品日本亚洲专区61| 国产精品99久久久久久久久久久久| 久久这里有精品视频| 97视频在线免费观看| 日韩福利伦理影院免费| 91在线免费网站| 国产精品夜色7777狼人| 亚洲最大av网站| 日韩视频免费中文字幕| 在线播放国产一区二区三区| 国内偷自视频区视频综合| 青青草国产精品一区二区| 日韩成人激情视频| 精品久久香蕉国产线看观看亚洲| 亚洲在线观看视频网站| 55夜色66夜色国产精品视频| 91网站在线免费观看| 精品一区二区三区四区在线| 美女黄色丝袜一区| 欧美日韩在线另类| 91高清免费在线观看| 欧美黑人极品猛少妇色xxxxx| 欧美一级片免费在线| 亚洲欧美日本精品| 亚洲91精品在线观看| 亚洲欧美中文字幕| 亚洲精品国产精品国产自| 成人激情免费在线| 日本在线精品视频| 亚洲国产精品99久久| 亚洲国产另类久久精品| 亚洲欧美日韩一区二区在线| 国产一区二区三区三区在线观看| 538国产精品视频一区二区| 国产精品香蕉av| 亚洲精美色品网站| 日韩亚洲综合在线| 亚洲精品久久久久中文字幕二区| 日本道色综合久久影院| 97超视频免费观看| 欧洲成人性视频| www高清在线视频日韩欧美| 日韩福利视频在线观看| 久久视频这里只有精品| 亚洲人精品午夜在线观看| 亚洲午夜色婷婷在线| 日韩激情在线视频| 亚洲人成在线电影| 日本成人精品在线| 欧美与欧洲交xxxx免费观看| 精品视频在线播放色网色视频| 国产日韩欧美影视| 欧美日韩精品在线观看| 午夜欧美不卡精品aaaaa| 日韩欧美亚洲国产一区| 97色在线观看免费视频| 成人免费网站在线| 欧美日韩国产麻豆| 按摩亚洲人久久| 亚洲欧美国产精品专区久久| 亚洲国产成人精品电影| 亚洲免费成人av电影| 中文日韩在线视频| 久久免费在线观看| 欧美午夜精品久久久久久浪潮| 色噜噜亚洲精品中文字幕| 国产高清视频一区三区|