2009-09-07 32 views
45

Làm cách nào tôi có thể đặt thuộc tính giá trị đã chọn của một Danh sách lựa chọn sau khi nó được khởi tạo mà không có một giá trị đã chọn;MVC - Đặt giá trị đã chọn của SelectList

SelectList selectList = new SelectList(items, "ID", "Name"); 

tôi cần phải thiết lập giá trị được lựa chọn sau khi giai đoạn

+0

Xem DDL tôi hướng dẫn http: //www.asp. net/mvc/hướng dẫn/javascript/làm việc-với-the-dropdownlist-box-và-jquery/sử dụng-the-dropdownlist-helper-với-aspnet-mvc và http://blogs.msdn.com/b/rickandy/ lưu trữ/2012/01/09/cascasding-dropdownlist-in-asp-net-mvc.aspx – RickAndMSFT

+0

Tôi tìm thấy một sửa chữa cho vấn đề này được báo cáo [ở đây] [1]. [1]: http://stackoverflow.com/a/11705380/277900 – ararog

+0

Đi vào cùng một câu hỏi.Cuối ngày tôi chỉ làm một NẾU Razor và nếu bị vô hiệu hóa có một dòng với đó bị vô hiệu hóa mã hóa khác cùng một dòng sao chép nhưng không có mã hóa vô hiệu hóa. Nó không ngắn gọn - nhưng nó dễ đọc và làm theo cho devs khác. – ppumkin

Trả lời

60

này Nếu bạn có đối tượng SelectList bạn, chỉ cần lặp qua các mục trong đó và thiết lập các "Đã chọn" tài sản của mục bạn muốn.

foreach (var item in selectList.Items) 
{ 
    if (item.Value == selectedValue) 
    { 
    item.Selected = true; 
    break; 
    } 
} 

Hoặc với LINQ:

var selected = list.Where(x => x.Value == "selectedValue").First(); 
selected.Selected = true; 
+0

Cảm ơn, tôi sẽ đánh dấu là câu trả lời nếu không có giải pháp nào khác - tôi đã hy vọng có một cách tích hợp để thiết lập thay vì lặp lại các mục – kaivalya

+3

Thuộc tính SelectedValue của SelectList chỉ đơn giản là vì không có đảm bảo tính duy nhất .. Bạn thực sự phải đối phó với nó ở cấp độ mặt hàng xa như tôi biết. – womp

+4

Cả hai tùy chọn không hoạt động trong tùy chọn lặp lại MVC3: Không hoạt động b/c item.Value không tồn tại. Tùy chọn LINQ: mục riêng lẻ được đặt thành công nhưng danh sách bỏ qua cập nhật. – Har

2

Tôi cần một người thả xuống trong một mạng lưới có thể chỉnh sửa bản thân mình với các giá trị thả xuống chọn trước. Ngoài ra, dữ liệu danh sách lựa chọn được cung cấp bởi bộ điều khiển cho chế độ xem, vì vậy dữ liệu được tạo trước khi chế độ xem sử dụng nó. Khi khung nhìn tiêu thụ SelectList, tôi đưa nó cho một trình trợ giúp tùy chỉnh sử dụng trình trợ giúp DropDownList tiêu chuẩn. Vì vậy, một giải pháp khá nhẹ imo. Đoán nó phù hợp với tinh thần ASP.Net MVC tại thời điểm viết; khi không hài lòng, hãy cuộn của riêng bạn ...

public static string DropDownListEx(this HtmlHelper helper, string name, SelectList selectList, object selectedValue) 
{ 
    return helper.DropDownList(name, new SelectList(selectList.Items, selectList.DataValueField, selectList.DataTextField, selectedValue)); 
} 
8

Tại sao bạn cố đặt giá trị sau khi bạn tạo danh sách? Tôi đoán là bạn đang tạo danh sách trong mô hình của bạn thay vì trong chế độ xem của bạn. Tôi khuyên bạn nên tạo sự đếm cơ bản trong mô hình của bạn và sau đó sử dụng này để xây dựng các SelectList thực tế:

<%= Html.DropDownListFor(m => m.SomeValue, new SelectList(Model.ListOfValues, "Value", "Text", Model.SomeValue)) %> 

Bằng cách đó giá trị được lựa chọn của bạn là luôn đặt cũng giống như xem là ra chứ không phải trước đó. Ngoài ra, bạn không phải đặt bất kỳ lớp UI không cần thiết nào (ví dụ: SelectList) trong mô hình của bạn và nó có thể vẫn không biết về giao diện người dùng.

+7

Bạn đã làm việc này thật không? Khi tôi sử dụng cách tiếp cận này, nó tạo ra html cho thả xuống tốt nhưng không phải là html để thiết lập giá trị được chọn dựa trên đối số cuối cùng cho hàm tạo SelectList. –

+2

Cách tiếp cận này cũng không hiệu quả đối với tôi. –

+9

Khi sử dụng phiên bản 'For' mạnh mẽ của' Html.DropDownList', "giá trị được chọn hiện tại" trong hàm tạo 'SelectList' bị bỏ qua. Tốt thực hiện trên nhận được 6 phiếu cho một câu trả lời không chính xác mặc dù :) –

2

Doug trả lời câu hỏi của tôi ... Nhưng tôi sẽ giải thích vấn đề của tôi là chính xác, và cách Doug giúp tôi giải quyết vấn đề mà bạn có thể gặp phải.

Tôi gọi jquery $.post và đang thay thế div của mình bằng chế độ xem một phần, như vậy.

function AddNewAddress (paramvalue) { 
    $.post(url, { param: paramvalue}, function(d) { 
     $('#myDiv').replaceWith(d); 
    }); 
} 

Khi làm như vậy, vì một lý do khi bước vào mô hình của tôi giá trị được lựa chọn của tôi sở hữu liên kết không bao giờ được thiết lập, chỉ cho đến khi tôi bước vào xem nó được đưa vào phạm vi.

Vì vậy, những gì tôi đã trước

@Html.DropDownListUnobtrusiveFor(model => model.CustomerAddresses[i].YearsAtAddress, Model.CustomerAddresses[i].YearsAtAddressSelectList, new {onchange = "return Address.AddNewAddress(this,'" + @Url.Action("AddNewAddress", "Address") + "'," + i + ")"}) 

Tuy nhiên mặc dù Model.CustomerAddresses [i] .YearsAtAddressSelectList, được thành lập ... nó không thiết lập giá trị được chọn.

Vì vậy, sau ....

@Html.DropDownListUnobtrusiveFor(model => model.CustomerAddresses[i].YearsAtAddress, new SelectList(Model.CustomerAddresses[i].YearsAtAddressSelectList, "Value", "Text", Model.CustomerAddresses[i].YearsAtAddress), new { onchange = "return Address.AddNewAddress(this,'" + @Url.Action("AddNewAddress", "Address") + "'," + i + ")" }) 

và nó làm việc!

tôi quyết định không sử dụng DropDownListFor vì nó có vấn đề khi sử dụng xác nhận không phô trương, đó là lý do tôi tham khảo những điều sau nếu bạn tò mò trong một lớp học xếp vào loại

HtmlExtensions.cs 




[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")] 

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList) 
{ 
    return DropDownListUnobtrusiveFor(htmlHelper, expression, selectList, null /* optionLabel */, null /* htmlAttributes */); 

} 


[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")] 

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes) 
{ 
    return DropDownListUnobtrusiveFor(htmlHelper, expression, selectList, null /* optionLabel */, new RouteValueDictionary(htmlAttributes)); 

} 


[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")] 

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, IDictionary<string, object> htmlAttributes) 
{ 
    return DropDownListUnobtrusiveFor(htmlHelper, expression, selectList, null /* optionLabel */, htmlAttributes); 

} 


[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")] 

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel) 
{ 
    return DropDownListUnobtrusiveFor(htmlHelper, expression, selectList, optionLabel, null /* htmlAttributes */); 

} 


[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")] 

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, object htmlAttributes) 
{ 
    return DropDownListUnobtrusiveFor(htmlHelper, expression, selectList, optionLabel, new RouteValueDictionary(htmlAttributes)); 

} 


[SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters", Justification = "Users cannot use anonymous methods with the LambdaExpression type")] 

[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")] 

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, IDictionary<string, object> htmlAttributes) 
{ 
    if (expression == null) 
    { 
     throw new ArgumentNullException("expression"); 
    } 


    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 



    IDictionary<string, object> validationAttributes = htmlHelper 
     .GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata); 



    if (htmlAttributes == null) 
     htmlAttributes = validationAttributes; 
    else 
     htmlAttributes = htmlAttributes.Concat(validationAttributes).ToDictionary(k => k.Key, v => v.Value); 



    return SelectExtensions.DropDownListFor(htmlHelper, expression, selectList, optionLabel, htmlAttributes); 

} 
3

Tiếp tục để @Womp câu trả lời, đó là đáng chú ý rằng "ở đâu" có thể được giảm xuống, và các vị có thể được đưa vào "đầu tiên" gọi trực tiếp, như thế này:

list.First(x => x.Value == "selectedValue").Selected = true;

+0

Để downvoter - bạn có thể quan tâm để giải thích tại sao cảm thấy đây là một câu trả lời xấu ?! –

15

Một chút muộn để bên đây nhưng dưới đây là cách Simp le này là:

ViewBag.Countries = new SelectList(countries.GetCountries(), "id", "countryName", "82"); 

này sử dụng getcountries phương pháp của tôi để cư một mô hình được gọi là quốc gia, obviousley bạn sẽ thay thế này với bất cứ nguồn dữ liệu của bạn là một mô hình vv, sau đó thiết lập id như giá trị trong SelectList. sau đó chỉ cần thêm thông số cuối cùng, trong trường hợp này là "82" để chọn mục được chọn mặc định.

[sửa] Dưới đây là làm thế nào để sử dụng này trong Razor:

@Html.DropDownListFor(model => model.CountryId, (IEnumerable<SelectListItem>)ViewBag.Countries, new { @class = "form-control" }) 

Hy vọng điều này giúp tiết kiệm một ai đó một thời gian.

+5

Bài đăng gốc cho biết "làm cách nào tôi có thể đặt giá trị sau khi nó được khởi tạo". Điều này không trả lời câu hỏi. –

1

Bạn có thể sử dụng phương thức bên dưới, điều này khá đơn giản.

new SelectList(items, "ID", "Name",items.Select(x=> x.Id).FirstOrDefault()); 

Điều này sẽ tự động chọn mục đầu tiên trong danh sách của bạn. Bạn có thể sửa đổi truy vấn trên bằng cách thêm mệnh đề where.

+1

OP đang hỏi cách đặt lựa chọn * sau * danh sách được khởi tạo. – ProfK

1

Tôi thường sử dụng phương pháp này

 public static SelectList SetSelectedValue(SelectList list, string value) 
    { 
     if (value != null) 
     { 
      var selected = list.Where(x => x.Value == value).First(); 
      selected.Selected = true; 
      return list; 
     } 
     return list; 
    } 
7

Đơn giản chỉ cần sử dụng tham số thứ ba cho giá trị được chọn trong mvc4

@Html.DropDownList("CountryList", new SelectList(ViewBag.Countries, "Value", "Text","974")) 

Here "974" được chọn Value rõ

Trong kết quả lựa chọn đất nước tôi hiện là qatar.in C# dưới đây`

foreach (CountryModel item in CountryModel.GetCountryList()) 
     { 
      if (item.CountryPhoneCode.Trim() != "974") 
      { 
       countries.Add(new SelectListItem { Text = item.CountryName + " +(" + item.CountryPhoneCode + ")", Value = item.CountryPhoneCode }); 

      } 
      else { 


       countries.Add(new SelectListItem { Text = item.CountryName + " +(" + item.CountryPhoneCode + ")", Value = item.CountryPhoneCode,Selected=true }); 

      } 
     } 
+0

Tôi nghĩ rằng tôi đã phải Cast mục ViewBag vào một IEnumerable, nhưng điều này làm việc hoàn hảo. –

0

Tôi muốn trình đơn thả xuống chọn giá trị khớp của id trong phương thức hành động. Bí quyết là đặt thuộc tính Đã chọn khi tạo Bộ sưu tập SelectListItem. Nó sẽ không hoạt động theo bất kỳ cách nào khác, có lẽ tôi đã bỏ lỡ điều gì đó nhưng cuối cùng, nó là thanh lịch hơn trong lựa chọn của tôi.

Bạn có thể viết bất kỳ phương thức trả về một boolean để thiết lập giá trị được lựa chọn dựa trên yêu cầu của bạn, trong trường hợp của tôi, tôi sử dụng phương pháp bình đẳng hiện

public ActionResult History(long id) 
     { 
      var app = new AppLogic(); 
      var historyVM = new ActivityHistoryViewModel(); 

      historyVM.ProcessHistory = app.GetActivity(id); 
      historyVM.Process = app.GetProcess(id); 
      var processlist = app.GetProcessList(); 

      historyVM.ProcessList = from process in processlist 
            select new SelectListItem 
            { 
             Text = process.ProcessName, 
             Value = process.ID.ToString(), 
             Selected = long.Equals(process.ID, id)          

            }; 

      var listitems = new List<SelectListItem>(); 

      return View(historyVM); 
     } 
Các vấn đề liên quan