ASP.NET MVC DropDownListFor 地雷

  • 902
  • 0
  • MVC
  • 2019-06-26

在使用 ModelBinding 的時候,欄位屬性如果是 uniqueidentifier

那這個欄位不管你有沒有設定為必要輸入,預設都會是必輸

最近工作上的專案有用到 AspNet.Identity,

使用上上手之後的確很方便,帳號的建立以及權限的控管都幫我處理了很多事情,

不免俗地在帳號建立以及管理的時候需要建立使用者的權限(會使用到Table:AspNetRoles)

我建立了兩個權限:

在管理帳號的畫面上我新增了一個下拉式選單

後端的資料來源

public List<SelectListItem> GetRolseListItem(bool AddAll = false)
        {
            using (ATISNewEntities db = new ATISNewEntities())
            {
                var query = (from p in db.AspNetRoles.AsQueryable()
                             orderby p.RoleName
                             select new
                             {
                                 p.Id,
                                 p.RoleDescription
                             }).ToList();

                List<SelectListItem> selectListItems = new List<SelectListItem>();

                if (AddAll)
                {
                    selectListItems.Add(new SelectListItem()
                    {
                        Text = "請選擇權限",
                        Value = ""
                    });
                }

                foreach (var item in query)
                {
                    selectListItems.Add(new SelectListItem()
                    {
                        Text = item.RoleDescription,
                        Value = item.Id.ToString()
                    });
                }
                return selectListItems;
            }
        }

其中,AspNetRoles的欄位Id,型態是 uniqueidentifier

所以當我再給 請選擇權限 這個預設下拉式控制項的時候,Id 直接給空白的話,

會發現前端會自動檢核這個下拉式選單沒有值,不讓你Submit

一開始我一直覺得納悶,我又沒有設這個欄位是必要輸入的選項,

為什麼一直不讓我重新查詢

後來才找到原來型別是Guid的話,一定要給一個預設值,

後來我修改方法是在給 請選擇權限 這個預設下拉式控制項的時候做調整

Value的地方給一個Guid.Empty.ToString()

if (AddAll)
 {
    selectListItems.Add(new SelectListItem()
     {
        Text = "請選擇權限",
        Value = Guid.Empty.ToString()
      });
 }

這個問題就解掉了

在使用 ModelBinding 的時候,欄位屬性如果是 uniqueidentifier

那這個欄位不管你有沒有設定為必要輸入,預設都會是必輸

這應該算是很巧合、誤打誤撞碰到的情境,

因為一般的狀況,如果要新增Guid型態的資料到資料庫內,都是在後端產生,不太可能讓使用者在前端輸入

我把Guid 型態的資料拿來當下拉式選項,又使用ModelBinding去接這個下拉式選項的值

所以才會碰到這個地雷