2011-07-24 44 views
47

Đây là mô hình của tôi:DropDownList bộ chọn giá trị trong MVC3 Razor

public class NewsCategoriesModel { 
    public int NewsCategoriesID { get; set; }   
    public string NewsCategoriesName { get; set; } 
} 

điều khiển của tôi:

public ActionResult NewsEdit(int ID, dms_New dsn) { 
    dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault(); 
    var categories = (from b in dc.dms_NewsCategories select b).ToList(); 
    var selectedValue = dsn.NewsCategoriesID; 
    SelectList ListCategories = new SelectList(categories, "NewsCategoriesID", "NewsCategoriesName",selectedValue); 

    // ViewBag.NewsCategoriesID = new SelectList(categories as IEnumerable<dms_NewsCategory>, "NewsCategoriesID", "NewsCategoriesName", dsn.NewsCategoriesID); 
    ViewBag.NewsCategoriesID = ListCategories; 
    return View(dsn); 
} 

Và rồi quan điểm của tôi:

@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID) 

Khi tôi chạy, các DropDownList không chọn giá trị tôi đặt .. Nó luôn chọn tùy chọn đầu tiên.

+9

Mô hình và danh sách lựa chọn của bạn có cùng tên, bạn không thể làm điều đó. Xem hướng dẫn DDL của tôi http://www.asp.net/mvc/tutorials/javascript/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc và http: //blogs.msdn.com/b/rickandy/archive/2012/01/09/cascasding-dropdownlist-in-asp-net-mvc.aspx – RickAndMSFT

+0

@ RickAnd-MSFT: Tôi tin rằng nhận xét của bạn xứng đáng được coi là câu trả lời được chấp nhận . cảm ơn –

Trả lời

92

Bạn nên sử dụng xem các mô hình và quên ViewBag Hãy suy nghĩ về nó như thể nó không tồn tại. Bạn sẽ thấy mọi thứ sẽ trở nên dễ dàng như thế nào. Vì vậy, xác định một mô hình điểm:

public class MyViewModel 
{ 
    public int SelectedCategoryId { get; set; } 
    public IEnumerable<SelectListItem> Categories { get; set; } 
} 

và sau đó cư mô hình quan điểm này từ bộ điều khiển:

public ActionResult NewsEdit(int ID, dms_New dsn) 
{ 
    var dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault(); 
    var categories = (from b in dc.dms_NewsCategories select b).ToList(); 

    var model = new MyViewModel 
    { 
     SelectedCategoryId = dsn.NewsCategoriesID, 
     Categories = categories.Select(x => new SelectListItem 
     { 
      Value = x.NewsCategoriesID.ToString(), 
      Text = x.NewsCategoriesName 
     }) 
    }; 
    return View(model); 
} 

và cuối cùng là theo quan điểm của bạn sử dụng mạnh mẽ gõ DropDownListFor helper:

@model MyViewModel 

@Html.DropDownListFor(
    x => x.SelectedCategoryId, 
    Model.Categories 
) 
+0

vâng, nó hoạt động ngay bây giờ, cảm ơn :) –

+43

Không có gì sai khi sử dụng ViewBag để chứa cơ chế chọn SelectList - cơ chế giàn giáo MVC thực hiện điều đó. Vấn đề của ông là sử dụng cùng tên cho mô hình và danh sách lựa chọn. – RickAndMSFT

+2

câu trả lời này hoàn toàn bị mất vấn đề. @ RickAndMSFT, cảm ơn giải pháp thực tế – Liam

18

chỉ trong trường hợp ai đó đi kèm với câu hỏi này, đây là cách tôi làm điều đó, hãy quên đi đối tượng kho lưu trữ, tôi đang sử dụng Mẫu Kho lưu trữ, bạn có thể sử dụng ngữ cảnh đối tượng của mình để truy xuất vi tities. Và cũng không chú ý đến tên thực thể của tôi, loại thực thể của tôi Hành động không liên quan gì đến Hành động MVC.

Bộ điều khiển:

ViewBag.ActionStatusId = new SelectList(repository.GetAll<ActionStatus>(), "ActionStatusId", "Name", myAction.ActionStatusId); 

chú ý Pay rằng biến cuối cùng của các nhà xây dựng SelectList là giá trị được lựa chọn (object SelectedValue)

Sau đó, đây là quan điểm của tôi để làm cho nó:

<div class="editor-label"> 
    @Html.LabelFor(model => model.ActionStatusId, "ActionStatus") 
</div> 
<div class="editor-field"> 
    @Html.DropDownList("ActionStatusId") 
    @Html.ValidationMessageFor(model => model.ActionStatusId) 
</div> 

Tôi nghĩ rằng nó là khá đơn giản, tôi hy vọng điều này sẽ giúp! :)

+1

bạn thưa bạn là một thiên tài! – Ben

+0

Cảm ơn Ben. Thành thật mà nói, tôi nghĩ rằng giải pháp của tôi là giải pháp đơn giản nhất trong số này. Chỉ cần tạo SelectList và đồng thời chuyển giá trị đã chọn trong hàm tạo của SelectList. Rất vui vì nó đã giúp bạn :) –

+0

Điều này làm việc tuyệt vời cho tôi khi tôi tìm thấy chính mình trong một tình huống mà tôi đã có một danh sách các loại viewmodel của tôi và cần thiết để làm vấn đề này nhiều lần trên cùng một trang trong một vòng lặp. Sạch hơn nhiều tôi nghĩ hơn là phải tái công cụ mô hình xem của tôi. – sovemp

8

Vâng nó rất đơn giản trong điều khiển bạn có somthing như thế này:

- Controller

ViewBag.Profile_Id = new SelectList(db.Profiles, "Id", "Name", model.Profile_Id); 

--Xem (Lựa chọn A)

@Html.DropDownList("Profile_Id") 

--Xem (Tùy chọn B) -> Gửi giá trị null đến danh sách

@Html.DropDownList("Profile_Id", null, "-- Choose --", new { @class = "input-large" }) 
+0

Xin vui lòng giải thích sự khác biệt giữa việc sử dụng 'null' thay vì' ViewBag.Profile_Id là SelectList' – nishanthan

5

Tôi muốn đặt câu trả lời chính xác ở đây, chỉ trong trường hợp những người khác đang gặp vấn đề này như tôi.Nếu bạn ghét ViewBag, tiền phạt không sử dụng, nhưng vấn đề thực sự với mã trong câu hỏi là tên giống nhau đang được sử dụng cho cả thuộc tính mô hình và danh sách chọn như được chỉ ra bởi @RickAndMSFT

Đơn giản chỉ cần thay đổi tên của điều khiển DropDownList nên giải quyết vấn đề, như vậy:

@Html.DropDownList("NewsCategoriesSelection", (SelectList)ViewBag.NewsCategoriesID) 

Nó không thực sự có bất cứ điều gì để làm với việc sử dụng ViewBag hoặc không sử dụng ViewBag như bạn có thể có một vụ va chạm tên với kiểm soát bất kể.

1

Để bộ phận CNTT được chọn, khi các phòng ban được tải từ bảng tblDepartment, hãy sử dụng hàm tạo quá tải sau của lớp SelectList. Lưu ý rằng chúng ta đang chuyển giá trị 1 cho tham số selectedValue.

ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1"); 
2

mã bên dưới, get from, đi

Bộ điều khiển:

int DefaultId = 1; 
ViewBag.Person = db.XXXX 
     .ToList() 
     .Select(x => new SelectListItem { 
      Value = x.Id.ToString(), 
      Text = x.Name, 
      Selected = (x.Id == DefaultId) 
     }); 

Xem:

@Html.DropDownList("Person") 

Lưu ý: ViewBag. Person và @ Html.DropDownList ("Person") tên nên càng theo quan điểm mô hình

+0

Giải pháp này làm việc cho tôi, vì tôi không có tùy chọn sử dụng DropdownListFor Tôi đã thực hiện thả xuống động trên thời gian chạy. Cảm ơn. – anu

6

Thay dưới đây phù hợp với mã mới làm việc Cập nhật:

@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID) 

Bây giờ Thực hiện mã mới làm việc được cập nhật :

@Html.DropDownListFor(model => model.NewsCategoriesID, ViewBag.NewsCategoriesID as List<SelectListItem>, new {name = "NewsCategoriesID", id = "NewsCategoriesID" }) 
4

Tôi đã khoan xuống danh sách thả xuống thay vì sử dụng @Html.DropDownList(). Điều này hữu ích nếu bạn phải đặt giá trị của danh sách thả xuống khi chạy trong dao cạo thay vì bộ điều khiển:

<select id="NewsCategoriesID" name="NewsCategoriesID"> 
    @foreach (SelectListItem option in ViewBag.NewsCategoriesID) 
    { 
     <option value="@option.Value" @(option.Value == ViewBag.ValueToSet ? "selected='selected'" : "")>@option.Text</option> 

    } 
</select> 
Các vấn đề liên quan