2011-12-21 23 views
28

Vì vậy, mã của tôi đã hoạt động trước đó. Tôi không biết những gì tôi đã làm cho điều này xảy ra và tôi dường như không thể sửa chữa nó. Tôi đã thấy mọi người nói để thiết lập lại ModelState. (ModelState.Clear();) Nhưng điều đó không giúp được gì. Ngoài ra, nó không giúp tôi vẫn còn khá mới mẻ với MVC. Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn.Mục ViewData có khóa 'CategoryId' thuộc loại 'System.Int32' nhưng phải thuộc loại 'IEnumerable <SelectListItem>'?

Bộ điều khiển:

public ActionResult Create() 
    { 
     ActiveDirectoryModel adm = new ActiveDirectoryModel(); 
     ViewBag.notifyto = adm.FetchContacts(); 
     var model = Populate(); 


     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Create(CreateViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      model.leaf.Date = DateTime.Now.Date; 
      model.leaf.Category = model.CategoryId; 
      model.leaf.SubCategory = model.SubCategoryId; 
      model.leaf.AssignedTo = model.AssignedToId; 
      model.leaf.CoAssignedTo = model.CoAssignedToId; 
      model.leaf.Status = model.StatusId; 
      model.leaf.Priority = model.PriorityId; 
      //model.lead.Parent = model.ParentID; 

      db.LeafItems.AddObject(model.leaf); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(model); 
    } 

    public CreateViewModel Populate() 
    { 
     ActiveDirectoryModel adm = new ActiveDirectoryModel(); 
     var model = new CreateViewModel 
     { 
      AssignedToItems = adm.FetchContacts(), 
      CoAssignedToItems = adm.FetchContacts(), 
      NotifyToItems = adm.FetchContacts(), 
      CategoryItems = 
       from c in new IntraEntities().CategoryItems.ToList() 
       select new SelectListItem 
       { 
        Text = c.Name, 
        Value = c.ID.ToString() 
       }, 
      SubCategoryItems = 
       from sc in new IntraEntities().SubCategoryItems.ToList() 
       select new SelectListItem 
       { 
        Text = sc.Name, 
        Value = sc.ID.ToString() 
       }, 
      StatusItems = 
       from s in new IntraEntities().StatusItems.ToList() 
       where s.IsPriority == false 
       select new SelectListItem 
       { 
        Text = s.Name, 
        Value = s.ID.ToString() 
       }, 
      PriorityItems = 
       from p in new IntraEntities().StatusItems.ToList() 
       where p.IsPriority == true 
       select new SelectListItem 
       { 
        Text = p.Name, 
        Value = p.ID.ToString() 
       } 
     }; 
     return model; 
    } 

Xem:

<div class="createTopInner"> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.leaf.Category) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.CategoryId, Model.CategoryItems, "") 
     @Html.ValidationMessageFor(model => model.leaf.Category) 
    </div> 
</div> 

mẫu:

public int CategoryId { get; set; } 
    public IEnumerable<SelectListItem> CategoryItems { get; set; } 
+1

Tôi đã khắc phục sự cố bằng cách chạy phương thức điền của tôi nếu ModelState.IsValid = false. Sau 8 giờ, tôi có thể đăng bài này dưới dạng câu trả lời thực sự. Tôi chỉ không muốn bất cứ ai lãng phí thời gian của họ cho đến lúc đó. – Ber53rker

Trả lời

51

Nếu ModelState bạn không hợp lệ trên hành động POST của bạn, bạn cần phải phục hồi lại tính SelectList của bạn:

if(ModelState.IsValid) 
{ 
    // save and redirect 
    // ... 
} 

// repopulate your SelectList properties: 
model.CategoryItems = GetCategories(); 

return View(model); 

Không repopulate toàn bộ mô hình bởi vì nếu không bạn có khả năng mất mọi thay đổi mà người dùng đã thực hiện.

+0

Cảm ơn. Nó vẫn giữ lại các giá trị. Nhưng giải pháp của bạn rõ ràng là tuyến đường an toàn hơn. – Ber53rker

+0

@Dismissile bạn có thể cung cấp thêm một số thông tin liên quan đến nó không. Tại sao chúng ta cần phải repopulate danh sách lựa chọn và có bất kỳ tác dụng phụ của nó. Cảm ơn –

+1

@AvneeshSrivastava MVC là không trạng thái. Khi bạn thực hiện POST, nó sẽ hiển thị lại toàn bộ khung nhìn và tất cả dữ liệu bạn đã có trước đó mà không được gửi trong POST sẽ bị mất. Khi bạn gửi biểu mẫu, bạn chỉ gửi giá trị đã chọn, không phải toàn bộ danh sách các mục. Bạn cần phải repopulate nó để nó có danh sách đầy đủ một lần nữa. – Dismissile

0

một cách khác tôi đã tìm ra giải pháp là lấy trường ẩn. vì vậy trong trường hợp của bạn, bạn có thể làm như sau:

@Html.HiddenFor(model => model.CategoryId) 

Bây giờ với một dạng trường khác cũng đăng và thiết lập CategoryId trong mô hình tương ứng.

Các vấn đề liên quan