01/10/2018, 09:04

Lỗi DropDownListFor khi dùng lazy loading

Chào các bác, Minh sử dụng code first tự động của Mvc 5 Entity Framework để render database lên model, chèn thêm thuộc tính mới Select… kiểu IEnumerable để dùng làm danh sách cho DropDownListFor:

    public bool? UserOnline { get; set; }

        public DateTime? UserLastOnline { get; set; }

        public int? LevelNownId { get; set; }

        public int? StarMark { get; set; }

        public int? FgBeginId { get; set; }

        public int? FgNownId { get; set; }

        public int? FgEndId { get; set; }

        public int? FgFutureId { get; set; }

        public int? HeadIdBegin { get; set; }

        public int? HeadIdNow { get; set; }

        public virtual Fg Fg { get; set; }
        public IEnumerable<SelectListItem> SelectFg { get; set; }

        public virtual Fg Fg1 { get; set; }

        public virtual Fg Fg2 { get; set; }

        public virtual Fg Fg3 { get; set; }

        public virtual Head Head { get; set; }

        public virtual Head Head1 { get; set; }

        public virtual Level Level { get; set; }
        public IEnumerable<SelectListItem> SelectLevel { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Account> Account1 { get; set; }

        public virtual Account Account2 { get; set; }

        public virtual Bdh Bdh { get; set; }
        public IEnumerable<SelectListItem> SelectBdh { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Account> Account11 { get; set; }

Bảng chính có các khoá phụ là Id của của bảng phụ, nên Minh dùng thuộc tính phụ khai báo thêm ở bảng thuộc tính bảng Select… để gán vào đó dữ liệu của bảng phụ dạng SelectList, nội dung hiển thị để chọn là Name, giá trị lẩy về là Id của Name tương ứng để truyền vào cho khoá phụ:

        public ActionResult AddMember()
        {
            Db db = new Db();
            Account obj = new Account();
            obj.SelectBdh = new SelectList(db.Bdhs.ToList(), "BdhId", "BdhFullname");
            obj.SelectFg = new SelectList(db.Fgs.ToList(), "FgId", "FgName");
            obj.SelectLevel = new SelectList(db.Levels.ToList(), " LevelId", "LevelName");
            return View(obj);
        }
        [HttpPost]
        public ActionResult AddMember(Account obj)
        {
            Db db = new Db();
            obj.UserCreateDate = DateTime.Now;
            obj.UserDoor = true;
            db.Accounts.Add(obj);
            db.SaveChanges();            
            return View(obj);
        }

Ở View sử dụng razo tạo DropDownListFor để lấy giá trị vào cho khoá phụ:

 <p>
        <label>Tên</label>
        @Html.TextBoxFor(m=>m.UserFirstName)
    </p>
    <p>
        <label>Fg begin</label>
        @Html.DropDownListFor(m=>m.FgBeginId, Model.SelectFg)
    </p>
    <p>
        <label>Fg End</label>
        @Html.DropDownListFor(m=>m.FgEndId,Model.SelectFg)
    </p>
    <p>
        <label> Fg Fututer</label>
        @Html.DropDownListFor(m=>m.FgFutureId,Model.SelectFg)
    </p>
    <p>
        <label>Số sao</label>
        @Html.TextBoxFor(m=>m.StarMark)
    </p>
    <p>
        <label> Level</label>
        @Html.DropDownListFor(m=>m.LevelNownId,Model.SelectLevel)
    </p>
    <p>
        <label>BDH tư vấn</label>
        @Html.DropDownListFor(m=>m.UserAddId,Model.SelectBdh)

Ở View Page, khi nhập liệu xong chạy, dữ liệu được đẩy xuống database thành công, nhưng trang vẫn xoay vòng và báo lỗi khác kiểu dữ liệu : ví dụ báo kiểu dữ liệu của database được gán là Int32, kiểu dữ liệu truyền vào là 'IEnumerable ’

Tuy nhiên khi kiểm tra ở Database thì các dữ liệu đã được đẩy vào đầy đủ:

Minh thử dùng Int.parse để ép kiểu nhưng do một kiểu là dữ liệu đơn, một kiểu nó hiểu là mảng nên không cho ép

Các anh chị em đi trước đã từng gặp vụ này hoặc biết cách khắc phục lỗi này vui lòng hướng dẫn mem mới như Minh với ạ. Trân trọng cảm ơn.

Chúc anh chị em ngày mới tràn đầy năng lượng!

ACP viết 11:08 ngày 01/10/2018

Theo cái thông báo trong hình thì: Cái model của bạn xài property FgGBeginId, FgEndId, FgFutureId là kiểu Int, Nhưng cái Dropdown được tạo ra từ kiểu IEnumerable. Bạn debug lại cái dòng db.BHS.ToList() có trả ra giá trị chưa hay vẫn là IENumerable (kiểu này chưa có giá trị cụ thể, vẫn còn là câu query của LinQ) và nó có các property gì.

P/s:Góp ý:Tại sao cột UserId lại dùng email làm khóa (Nhìn hình mình đoán vậy), lỡ bị trùng email thì sao?

Đức Minh viết 11:08 ngày 01/10/2018

Cảm ơn bác Hao, mình đúng là đang dùng Email làm khoá chính, Email thì không trùng được đâu bác ạ, chỉ trừ trường hợp hai người xài chung 1 email, mình sẽ tạo hàm kiểm tra thêm điều kiện này đã tồn tại hay chưa, cảm ơn bác nhé

Nguyễn Văn Thành viết 11:10 ngày 01/10/2018

Bác có thể cho mình xin bộ code này không… Mình đang tập tành học MVC

Đức Minh viết 11:21 ngày 01/10/2018

Oh, xin lỗi bạn nhưng mình không thể cho ;0

Bài liên quan
0