2012-10-20 69 views
8

Đọc từ đây: ASP.NET MVCDropDownList Binding vào MVC Xem

Action SelectCategory đã được tạo ra bên trong bộ điều khiển -

public ActionResult SelectCategory() { 

    List<SelectListItem> items = new List<SelectListItem>();  
    items.Add(new SelectListItem { Text = "Action", Value = "0"});  
    items.Add(new SelectListItem { Text = "Drama", Value = "1" });  
    items.Add(new SelectListItem { Text = "Comedy", Value = "2", Selected = true });  

    ViewBag.MovieType = items; 

    return View();  
} 

Tôi không thể hiểu được ràng buộc của dữ liệu trong sau dòng.

@Html.DropDownList("MovieType") 

Trong khi ràng buộc dữ liệu theo cách tương tự,

@Html.DropDownList("IdList"); 

tôi được sự thoả sau sai sót

There is no ViewData item of type 'IEnumerable' that has the key 'IdList'.

điều khiển hành động:

public ActionResult SelectId() 
    { 
     List<SelectListItem> items = new List<SelectListItem>(); 
     items.Add(new SelectListItem { Text = "MyId1", Value = "MyId1", Selected=true }); 
     items.Add(new SelectListItem { Text = "MyId2", Value = "MyId2" }); 

     ViewBag.IdList = items; 
     return View(); 
    } 

W mũ tôi thiếu? Cảm ơn sự giúp đỡ của bạn !

+0

Tất cả mọi thứ có vẻ là tốt. Có thể bạn nên thử @ Html.DropDownList (ViewBag.IdList); –

+0

Html.DropDownList có 8 (tám) quá tải cho phép bạn chỉ định mọi thứ bao gồm danh sách bạn muốn hiển thị trong các tùy chọn. Xin vui lòng đi qua các tài liệu của Html.DropDownList đây –

+0

thử này Html.DropDownList ("anyname", ViewBag.IdList) - constructor này chấp nhận hai params - tên và danh sách bạn muốn hiển thị –

Trả lời

21

bạn đã thiết ViewBag.MovieType => khi bạn sử dụng @Html.DropDownList("MovieType") menu thả xuống sẽ sử dụng giá trị này. Khi bạn viết @Html.DropDownList("IdList"), trình trợ giúp không tìm thấy thuộc tính IdList tương ứng trong ViewBag và ném lỗi vì nó không biết từ nơi nào để ràng buộc dữ liệu.

Ngoài ra nếu bạn muốn thay đổi tên của kéo xuống, bạn có thể sử dụng như sau:

@Html.DropDownList("SelectedMovieType", (IEnumerable<SelectListItem>)ViewBag.MovieType) 

và hành động POST của bạn sẽ có một tham số SelectedMovieType để lấy giá trị được chọn.

Nhưng tôi sẽ tránh ViewBag. Xác định một mô hình xem là tốt hơn:

public class MyViewModel 
{ 
    public string SelectedMovieType { get; set; } 
    public IEnumerable<SelectListItem> MovieTypes { get; set; } 
} 

và sau đó có hành động điều khiển của bạn cư mô hình quan điểm này và vượt qua nó để xem:

public ActionResult SelectId() 
{ 
    List<SelectListItem> items = new List<SelectListItem>(); 
    items.Add(new SelectListItem { Text = "MyId1", Value = "MyId1", Selected=true }); 
    items.Add(new SelectListItem { Text = "MyId2", Value = "MyId2" }); 

    var model = new MyViewModel 
    { 
     MovieTypes = items  
    }; 

    return View(model); 
} 

và theo quan điểm mạnh mẽ gõ của bạn:

@model MyViewModel 
@Html.DropDownListFor(x => x.SelectedMovieType, Model.MovieTypes) 
3

trong khi ràng buộc bạn liệt kê để kéo xuống, bạn cần gõ bỏ nó vào IEnumerable khi bạn sử dụng @ Html.DropDown kiểm soát mà không phải là gõ mạnh với Model

Trong Xem

@Html.DropDownList("MovieType",(IEnumerable<SelectListItem>)ViewBag.MovieType) 

và cho một cách khác nếu bạn ràng buộc IdList sau đó

@Html.DropDownList("IdList",(IEnumerable<SelectListItem>)ViewBag.IdList) 
+0

Hi Shivkumar, Trên mã ném lỗi: 'Không có mục ViewData loại 'IEnumerable ' có khóa 'IdList'.' Bất kỳ đề xuất nào? – Abhijeet

+0

@autrevo, bạn có thể vui lòng chỉ cho tôi một số lỗi do tôi không thể tái tạo nó ở đây – Shivkumar

+0

Cảm ơn. – Abhijeet

0

Một cách không đau để gắn kết dữ liệu để liên kết dữ liệu với mô hình: Không sử dụng dao cạo cho Dropdown. Liên kết thủ công với đối tượng FormCollection.

Bộ điều khiển:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(Sorun sorun,FormCollection fc) 
    { 
     //Define independently as form collection 

     sorun.GonderilecekBirim = fc["GonderilecekBirim"]; 
     sorun.IlkSorulmaTarihi = DateTime.Now; 
     if (ModelState.IsValid) 
     { 

      db.Soruns.Add(sorun); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(sorun); 
    } 

Xem

@Html.LabelFor(model => model.GonderilecekBirim, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      <!-- Define as raw html --> 
      <select id="GonderilecekBirim" name="GonderilecekBirim"> 
       <option value="4">Satın Alma</option> 
       <option value="5">Muhasebe</option> 
      </select> 

      @*@Html.ValidationMessageFor(model => model.GonderilecekBirim, "", new { @class = "text-danger" })*@ 
     </div> 
Các vấn đề liên quan