首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 表單數據自動映射到實體與列表:反射實現通用綁定器

     編輯:ASP.NET 基礎

痛點

WebForms 手動 Request["field"] 取值繁瑣;MVC 雖支援模型綁定,但不原生支持 List<T> 批量綁定(同名字段多行)。

解決方案:RequestToModel 靜態工具類

單實體綁定

<input name="id" value="1" />
<input name="sex" value="男" />
var model = RequestToModel.GetSingleForm<UserModel>();
// 或帶前綴:GetSingleForm<UserModel>("form1.")

列表綁定

<input name="id" value="1" /><input name="sex" value="男" />
<input name="id" value="2" /><input name="sex" value="女" />
<input name="id" value="3" /><input name="sex" value="女" />
var list = RequestToModel.GetListByForm<UserModel>();
// 自動識別為 3 條記錄

核心邏輯

private static List<T> SetList<T>(string prefix, int index) where T : new()
{
    var list = new List<T>();
    var props = new T().GetType().GetProperties();
    // 以第 index 個屬性為基準,統計該字段在 Request 中出現的次數(逗號分隔)
    int count = HttpContext.Current.Request[prefix + props[index].Name].Split(',').Length;

    for (int i = 0; i < count; i++)
    {
        var entity = new T();
        foreach (var p in props)
        {
            string raw = HttpContext.Current.Request[prefix + p.Name];
            if (!string.IsNullOrEmpty(raw))
            {
                string val = raw.Split(',')[i];
                p.SetValue(entity, Convert.ChangeType(val, p.PropertyType), null);
            }
        }
        list.Add(entity);
    }
    return list;
}

關鍵約定

  1. 表單 name 必須與實體屬性名完全一致(不區分大小寫)。
  2. 列表綁定時,所有字段必須同數量、同順序出現(瀏覽器提交同名字段以逗號分隔)。
  3. 首個屬性(index=0)作為基準計數,若首字段可能為空,可重載指定 index。

適用場景

  • 動態行編輯表格(增刪行後整體提交)。
  • 批量導入預覽確認頁。
  • legacy WebForms 專案快速引入模型綁定能力。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved