麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

2019-11-17 03:53:31
字體:
來源:轉載
供稿:網友
     從開發者的角度來看,創建asp.net MVC的View是一件很爽的事,因為你可以精確控制最終生成的HTML。具有諷刺意味的是不得不寫出每一行HTML代碼同時也是Asp.net MVC的View中讓人不爽的地方。讓我用我的一個經歷來告訴我創建ASP.Net MVC view Helpers背后靈感的由來。由一小部分開發人員(包括我)和一個CSS設計人員(我們叫他Ricky)組成的小組,開始了一個新的Asp.net MVC的項目,在項目開發過程中;我給頁面添加了一些TextBox和一些其他元素,我check-in了我的代碼,直到回家我也沒再想起過這事。隔夜早晨,剛上班時我就從CSS設計那里收到一封郵件來通知我我必須按照他的CSS指導方針來寫HTML,比如說對于textbox,必須遵循以下規則:

每個textbox必須內嵌在li標簽中
每一個textbox都必須有一個label標簽的for屬性與之對應
textbox必須使用input標簽并設置type屬性為text
      對于這些要求我一一照做并修改我的代碼符合了后兩條規則,但我忘了關于li的指導方針,我很快更新了頁面并提交了我的代碼。幾天后,項目又推進了很多,Ricky來到我的辦公桌前并讓我看看我所做的改變。打開頁面,他開始一一列舉那些我不遵循它的UI規定的地方,有很多地方我都忽視了因為我甚至不知道這些指導方針的存在.在他指出這些后,我想:一定會有方法可以讓我們兩個人都如愿以償.對于我來說只是需要html標簽的id,對于Ricky來說他需要我的HTML符合規范來讓他的CSS文件能夠選擇到合適的html。所以我們引入了view helper.

       在我用Asp.net MVC時我注意到我自己寫了很多純Html,比如div和span,同時伴隨使用了很多System.Web.Mvc.HtmlHelper來生成html,比如說一個輸入名字的textbox:

<li>
    <label for="FirstName">First name</label>
    <%= Html.TextBox("FirstName") %>     
    <%= Html.ValidationMessage("FirstName", "*") %>
</li>    我就想,是不是能有一種方法來將上面的所有代碼融合在一起呢。這樣不僅讓我編程更加輕松,而且再也不用擔心Ricky給我設置的條條框框了。理想的情況下會滿足以下標準:

容易執行
重用性好
強制執行某些標準(比如Ricky的)
和標準的HtmlHelper擴展方法用起來沒太大區別
容易使用
    在我們進入執行這個的細節之前如果你感覺這聽起來像又回到了Web Form時代,那就錯了。view helper僅僅是在創建HTML的時候起輔助作用,而不是將HTML進行抽象。我關心的只是HTML在頁面中的顯示效果以及使用javascript的行為更輕松.而不是textbox是否放入li中,當我需要創建一個textbox時,我只需在view中放入如下代碼:

<% Html.NewText("FirstName", "First name"); %>
     我想聲明我僅僅是想將創建HTML延遲到另一個類中。使用View helper我可以輕松做到這一點。首先我們先來看標準的HtmlHelper擴展方法如何做到這一點.

     Html helper有兩種實現用法,大多數的使用方法都會如下:

<%= Html.TextBox("FirstName") %>
     而還有一種用法和聲明一個form元素很相似:

<% using (Html.BeginForm()) { %>
    <!--  Other elements here-->
<% } %>      上面兩種方法的主要區別是Html.TextBox僅僅返回一個string來注入到view中。這也是為什么使用<%=而不是標準的的代碼塊。而另一種以對象作為返回類型的方法更老練許多,比如,System.Web.Mvc.Html.MvcForm,這個對象放入using語句.對象被創建時一些HTML就會被注入到view中(嚴格說:并不是對象創建時,但很接近)還有一些事在對象被回收時將html注入view(也就是碰到”}”符號時).使用這種方法的好處是可以在using語句之間插入代碼。這使它的能力無疑比那些僅僅返回一個字符串注入頁面的方式要強大許多。

      所以,我選擇第二種方法來實現我的View Helpers.所以HtmlHelper擴展方法會實現我創建的IViewObject接口對象。類圖如下:

      

      可以看到,IViewObject實現了System.IDisposable接口。這使實現如前面所提到和Html.BeginForm的使用方法類似所必須的。IViewObject有兩個方法,StartView和EndView.這兩個方法分別在對象創建時和對象回收時被調用.為了讓這些對象的創建更加容易我創建了一個抽象類來處理:執行方法,回收對象和在合適的時候調用EndView方法。類圖如下:

    



上圖中的抽象類完整代碼如下:

public abstract class AbstractHtmlViewObject : IViewObject
{
    PRivate bool mDisposed;

    public AbstractHtmlViewObject(ViewRequestContext requestContext, string name)
    {
        if (requestContext == null)  
        { throw new ArgumentNullException("requestContext"); }

        ViewRequestContext = requestContext;
        Name = name;
    }

    public IViewRequestContext RequestContext
    {
        get;
        protected set;
    }
   #region IViewObject Members
   public object Attributes { get; set; }
   public string Name { get; set; }
   public abstract void StartView();
   public abstract void EndView();
   #endregion
   // based on System.Web.Mvc.HtmlHelper.GetModelStateValue
   public object GetModelStateValue(string key, Type destinationType)
   {
       object result = null;
       ModelState modelState;
       if (ViewRequestContext.HtmlHelper.ViewData.ModelState.TryGetValue(
           key, out modelState))
       {
           result = modelState.Value.ConvertTo(destinationType, null);
       }
       return result;
   }
    #region IDisposable Members
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!mDisposed)
        {
            mDisposed = true;

            EndView();
        }
    }
    #endregion
}      如你所見上面AbstractHtmlViewObject對象不僅滿足了最上面提到的列表(Ricky那段里),還包含了一些輔助類更容易擴展的東西。也就是它包含的一個屬性:RequestContext,這個屬性可以幫助我們很容易創建HTML和擴展方法GetModelStateValue,我們會在后面詳細講述GetModelStateValue的使用方法。我們會在后面講述RequestContext的細節,這里我們先看看如何創建我們先前討論的那個textbox。

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

待續…

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

translated by CareySon

1 1 0
您已投過票
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产成人高清成人av片在线看 | 黄网站在线播放视频免费观看 | 国产一级一国产一级毛片 | 人成免费网站 | 久久国产精品99国产 | 黄色大片网站在线观看 | 99影视在线视频免费观看 | 久久久久一本一区二区青青蜜月 | 欧美日本亚洲视频 | 成人免费福利视频 | 色中色在线播放 | 欧美成人午夜精品久久久 | 日本不卡二区 | 婷婷中文字幕一区二区三区 | 免费网址黄 | 欧美日韩高清不卡 | 精品亚洲一区二区 | 久久99精品国产自在现线 | 国产资源在线播放 | 亚洲小视频在线播放 | 久久久久久久久久久久久久av | 男女无遮挡羞羞视频 | 免费a观看| 欧美成人免费一区二区三区 | 成人在线观看小视频 | 99久久婷婷国产综合精品青牛牛 | 亚洲免费高清 | 日韩精品中文字幕一区二区 | 免费看成年人视频在线 | 国产亚洲精品久久久久5区 日韩一级片一区二区三区 国产精品久久久久av | 美国黄色毛片女人性生活片 | 史上最强炼体老祖动漫在线观看 | 日韩精品中文字幕一区二区三区 | 久久国产精品电影 | 激情在线免费观看 | 成人一级黄色大片 | 最新一区二区三区 | 国产精品一区二区三区在线播放 | 成人做爰高潮片免费视频美国 | 久久久久av69精品 | 国产精品久久久久久久久久久天堂 |