2009-09-07 2 views
45

Как установить свойство selectedvalue в SelectList после его создания без выбранного значения;MVC - Установить выбранное значение SelectList

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

Мне нужно установить выбранное значение после этого этапа

+0

Смотрите мой DDL учебников Http: //www.asp. net/mvc/tutorials/javascript/work-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc и http://blogs.msdn.com/b/rickandy/ архив/2012/01/09/cascasding-dropdownlist-in-asp-net-mvc.aspx – RickAndMSFT

+0

Я нашел исправление для этой проблемы, о которой сообщается [здесь] [1]. [1]: http://stackoverflow.com/a/11705380/277900 – ararog

+0

Ran в тот же самый вопрос.Конец дня я только что сделал Razor IF, и если у отключенного есть строка с отключенной кодировкой, то одна и та же строка скопирована, но без отключенной кодировки. Ее краткость - но ее легко читать и следить за другими разработчиками. – ppumkin

ответ

60

Если у вас есть объект SelectList, просто перебирать элементы в нем и установить «Selected» свойство элемента, который вы хотите.

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

Или с Linq:

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

Спасибо, я буду отмечать как ответ, если нет другого решения - я ожидал, что существует встроенный способ установить его вместо итерации по элементам. – kaivalya

+3

Свойство SelectedValue для SelectList доступно только потому, что нет гарантии уникальности. насколько мне известно, вам действительно нужно иметь дело с этим уровнем предмета. – womp

+4

Оба варианта не работают в MVC3 Вариант итерации: не работает элемент b/c.Value не существует. Linq Option: индивидуальный элемент установлен успешно, но список игнорирует обновление. – Har

2

мне нужен выпадающий список в редактируемые сетки себя с заранее заданными параметрами раскрывающихся. Afaik, данные списка выбора предоставляются контроллером для представления, поэтому он создается до того, как его потребляет. Когда представление потребляет SelectList, я передаю его специальному помощнику, который использует стандартный помощник DropDownList. Итак, довольно легкое решение imo. Угадайте, что он вписывается в дух ASP.Net MVC на момент написания; когда не доволен своим собственным ...

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

Почему вы пытаетесь установить значение после создания списка? Я предполагаю, что вы создаете список в своей модели, а не в своем представлении. Я рекомендую создать основные перечислим в вашей модели, а затем использовать это, чтобы построить реальную SelectList:

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

Таким образом, выбранное значение всегда устанавливаются так же, как вид оказывается и не раньше. Кроме того, вам не нужно вводить ненужные классы пользовательского интерфейса (например, SelectList) в вашу модель, и он может не знать о пользовательском интерфейсе.

+7

У вас было это работает на самом деле? Когда я использую этот подход, он генерирует html для прекращения, но не html, чтобы установить выбранное значение на основе последнего аргумента для конструктора SelectList. –

+2

Этот подход не работает и для меня. –

+9

При использовании строго типизированной '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Молодец, получив 6 голосов за неправильный ответ, хотя :) –

2

Doug ответил на мой вопрос ... Но я объясню, в чем была моя проблема, и как Дуг помог мне решить мою проблему, с которой вы могли столкнуться.

Я вызываю jquery $.post и заменяю свой div своим частичным представлением, вот так.

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

При этом, по какой-то причине, когда вступает в мою модель моего выбранное значение аффилированной свойство не было установлена, только пока я не вышел в поле зрения он пришел в область видимости.

Итак, что я имел перед тем

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

Однако даже если Model.CustomerAddresses [я] .YearsAtAddressSelectList, был установлен ... он не установил выбранное значение.

Так после ....

@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 + ")" }) 

и работал!

я решил не использовать DropDownListFor, как это имеет проблемы при использовании ненавязчивых проверок, поэтому я ссылаться на если следующий вашем любопытные в классе классифицироваться

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

Дальше @Womp ответа, стоит отметить, что «где» можно опустить, а предикат может быть введен в «первый» вызов непосредственно, как это:

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

+0

К нисходящему - не могли бы вы объяснить, почему чувствуете, что это плохой ответ ?! –

15

немного опоздал на вечеринку здесь, но вот как простофиля ле это:

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

это использует мой метод getcountries для заполнения модели под названием страны, obviousley вы бы заменить это с тем, что ваш источник данных, модель и т.д., а затем устанавливает идентификатор в качестве значения в SelectList. то просто добавьте последний параметр, в этом случае «82», чтобы выбрать выбранный по умолчанию элемент.

[править] Вот как использовать это в Razor:

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

Надеется, что это экономит кого-то некоторое время.

+5

В исходном сообщении говорится: «Как установить значение после его создания». Это не отвечает на вопрос. –

1

Вы можете использовать ниже метод, который довольно прост.

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

Это автоматический выбор первого элемента в вашем списке. Вы можете изменить указанный выше запрос, добавив предложение where.

+1

OP спрашивает, как установить выбор * после *, создается экземпляр списка. – ProfK

1

Я обычно использую этот метод

 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

Просто используйте третий параметр для выбранного значения в mvc4

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

Здесь «974» выбрано значение, указанное

В моей результате выбранной страны в настоящее время qatar.in C# как ниже

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

Думаю, мне пришлось переместить элемент ViewBag в IEnumerable, но это сработало отлично. –

0

Я хотел, чтобы выпадающее меню выбрало подходящее значение id в методе действий. Хитрость заключается в том, чтобы установить свойство Selected при создании коллекции SelectListItem. Это не сработало бы иначе, возможно, я пропустил что-то, но в конце концов, это более элегантно по моему выбору.

Вы можете написать любой метод, который возвращает логическое значение, чтобы установить выбранное значение, основанное на ваших требованиях, в моем случае я использовал существующий Равный метод

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); 
     } 
Смежные вопросы