愛上MVC~為Html.EditorForModel自定義模版

来源:http://www.cnblogs.com/lori/archive/2016/10/17/5969658.html
-Advertisement-
Play Games

回到目錄 挺有意思的一件事 對於MVC視圖渲染來說,大家應該不會陌生,但對於模型的渲染,不知道是否聽說過,主要是說Model通過它屬性的相關特性(DataType,UIHint)來將它們自動渲染到View上,這是一個比較不錯的技術,因為使用傳統的Html.EditorForModel去渲染是不能滿足 ...


回到目錄

挺有意思的一件事

對於MVC視圖渲染來說,大家應該不會陌生,但對於模型的渲染,不知道是否聽說過,主要是說Model通過它屬性的相關特性(DataType,UIHint)來將它們自動渲染到View上,這是一個比較不錯的技術,因為使用傳統的Html.EditorForModel去渲染是不能滿足我們要求的,因為他只是在頁面上渲染Input文本框,如果希望出現下拉列表,複雜的單選和覆選,它是實現不了的,這需要我們進行定製,即自定義的模版!

模版文件夾位於shared/EditorTemplates/下麵

這些模版需要通過模型屬性的UIHint來指定,如[UIHint("_EnumDropdownList")],表示使用一個叫_EnumDropdownList.cshtml的模版文件來渲染這個屬性,當然對於系統模版來說,你可以直接使用它們,也是使用UIHint特性來指定的.

下麵代碼中是我定義ViewModel的代碼,有系統的UIHint,如MultilineText,Bool等,也有自定義的模版如_EnumRadio,_EnumCheckbox等

        [DisplayName("標題")]
        public string Name { get; set; }
        [DisplayName("年紀")]
        public int Age { get; set; }
        [DisplayName("Email")]
        [UIHint("MultilineText")]
        public string Email { get; set; }
        [DisplayName("類型_EnumRadio"), EnumDataType(typeof(Type))]
        [UIHint("_EnumRadio")]
        public Type Type { get; set; }
        [DisplayName("類型_EnumCheckbox"), EnumDataType(typeof(Type))]
        [UIHint("_EnumCheckbox")]
        public Type Type2 { get; set; }
        [DisplayName("類型_EnumDropdownList"), EnumDataType(typeof(Type))]
        [UIHint("_EnumDropdownList")]
        public Type Type3 { get; set; }
        [DisplayName("出生日期")]
        [UIHint("_DateTime")]
        public DateTime Birthday { get; set; }
        [DisplayName("性別")]
        [UIHint("Bool")]
        public bool Sex { get; set; }

我們來看一下,如何在/shared/EditorTemplates下建立自定義的模版,下麵大叔將自己的幾個模版分想一下

日期時間選擇器

@model DateTime
@Html.TextBoxFor(m => m, new { onfocus = "WdatePicker({isShowWeek:true})", @class = "Wdate", })
<script src="~/Scripts/jquery-1.4.1.min.js"></script>
<script src="~/Scripts/My97DatePicker4.7/WdatePicker.js"></script>

枚舉-下拉列表框

@model Enum
@using Lind.DDD.Utils;
@Html.DropDownListFor(m => m, Enum.GetValues(Model.GetType())
    .Cast<Enum>()
    .Select(m =>
    {
        int enumVal = Convert.ToInt32(m);
        return new SelectListItem()
        {
            Selected = (Convert.ToInt32(Model)== enumVal),
            Text = m.GetDescription(),
            Value = enumVal.ToString()
        };
    }))

枚舉-單選按鈕組

@model Enum
@using Lind.DDD.Utils;
@{
    var name = Model.GetType().Name;
    var list = Enum.GetValues(Model.GetType())
     .Cast<Enum>()
     .Select(m =>
     {
         int enumVal = Convert.ToInt32(m);
         return new SelectListItem
         {
             Selected = (Convert.ToInt32(Model) == enumVal),
             Text = m.GetDescription(),
             Value = enumVal.ToString()
         };
     });
}
@foreach (var item in list)
{
    string isSel = item.Value == Convert.ToInt32(Model).ToString() ? "checked='checked'" : "";
    <input type="radio"  name="@name" id="@(name + item.Value)" value="@item.Value" @isSel/><label for="@(name + item.Value)">@item.Text</label>
}

枚舉-篩選按鈕組

@model Enum
@using Lind.DDD.Utils;
@{
    string name = ViewData.TemplateInfo.HtmlFieldPrefix;
    var list = Enum.GetValues(Model.GetType())
    .Cast<Enum>()
    .Select(m =>
    {
        int enumVal = Convert.ToInt32(m);
        return new SelectListItem()
        {
            Selected = (Convert.ToInt32(Model) == enumVal),
            Text = m.GetDescription(),
            Value = enumVal.ToString()
        };
    });
}
@foreach (var item in list)
{
    string isSel = item.Value == Convert.ToInt32(Model).ToString() ? "checked='checked'" : "";

    <input type="checkbox" name="@name" id="@(name + item.Value)" value="@item.Value" @isSel/><label for="@(name + item.Value)">@item.Text</label>
}

怎麼樣,這種代碼挺有意思吧,以後再渲染時,直接在屬性上標識即可,它的View會動態去自動渲染!

這種功能對插件模塊開發,換膚開發很有效果!

回到目錄


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、概覽 1.1、介紹 ...
  • 上大學時學校開過一門課程就是數據結構,當時學的似懂非懂,不知道它的重要性,現在工作了,想撿起來,所以重新買了本書,重溫數據結構,我自己會記錄整個學習的過程,有興趣的同學可以一起。 今天剛看到基礎篇,也記錄下來,方便日後查看和再次回顧。 <一>你需要知道的一些名詞定義: 1.數據:數據是對客觀事物的符 ...
  • 為.net core 配一個基於html5的UI框架 傳送門:TchApp項目說明 ...
  • [ASP.NET Core] Getting Started 前言 本篇文章介紹如何快速建立一個ASP.NET Core應用程式,為自己留個紀錄也希望能幫助到有需要的開發人員。 ASP.NET Core官網 環境 建立一個ASP.NET Core應用程式,首先要從官網下載SDK來建置.NET Cor ...
  • 枚舉類型是定義了一組“符號名稱/值”配對。枚舉類型是強類型的。每個枚舉類型都是從system.Enum派生,又從system.ValueType派生,而system.ValueType又從system.Object派生,所以枚舉類型是指類型。 編譯枚舉類型時,C#編譯器會把每個符號轉換成類型的一個常 ...
  • 上一章我們講到關於C#線程方向的應用。但是筆者並沒有講到多線程中的另一個知識點——同步。多線程的應用開發都有可能發生臟數據。同步的功能或多或少都會用到。本章就要來講一下關於線程同步的問題。根據筆者這幾年來的.NET開發可以瞭解到的同步方式至少有四種以上。如。lock、volatile、Monitor ...
  • VS中如何快捷地給自己的代碼添加創建信息註釋 Intro 以下討論的都是沒有使用 GIT 來管理源代碼的情況,如果使用 GIT 管理源代碼可直接使用VS的Git擴展就不需要考慮以下問題。 什麼是創建信息註釋? 創建信息註釋,類似於文件的創建信息,一般來說,至少要有創建人和創建時間。如果說有人修改了方 ...
  • spring的事務處理分為兩種: 1、編程式事務:在程式中控制事務開始,執行和提交;(不建議使用,所以這裡我就不說明太多) 2、聲明式事務:在Spring配置文件中對事務進行配置,無須在程式中寫代碼;(建議使用) 我對”聲明式“的理解是這樣的:Spring配置文件中定義好了這樣一個規則, 這個規則可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...