Как я могу установить свойство selectedvalue в SelectList после того, как он был создан без выбранного значения,
SelectList selectList = new SelectList(items, "ID", "Name");
Мне нужно установить выбранное значение после этого этапа
Как я могу установить свойство selectedvalue в SelectList после того, как он был создан без выбранного значения,
SelectList selectList = new SelectList(items, "ID", "Name");
Мне нужно установить выбранное значение после этого этапа
Если у вас есть объект SelectList, просто перебирайте элементы в нем и задайте свойство "Выбранное" элемента, который вы хотите.
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;
Немного опоздал на вечеринку, но вот как это просто:
ViewBag.Countries = new SelectList(countries.GetCountries(), "id", "countryName", "82");
он использует мой метод getcountries для заполнения модели, называемой странами, очевидно, вы бы заменили ее на любой источник данных, модель и т.д., а затем установили id в качестве значения в списке выбора. затем просто добавьте последний параметр, в этом случае "82", чтобы выбрать выбранный элемент по умолчанию.
[edit] Вот как использовать это в Razor:
@Html.DropDownListFor(model => model.CountryId, (IEnumerable<SelectListItem>)ViewBag.Countries, new { @class = "form-control" })
Важное замечание: Кроме того, еще одна вещь, на которую следует обратить внимание: убедитесь, что поле модели, которое вы используете для хранения выбранного идентификатора (в данном случае model.CountryId) из раскрывающегося списка, имеет значение NULL и при загрузке первой страницы имеет значение NULL. Этот получает меня каждый раз.
Надеюсь, это сэкономит кому-то время.
Просто используйте третий параметр для выбранного значения в mvc4
@Html.DropDownList("CountryList", new SelectList(ViewBag.Countries, "Value", "Text","974"))
Здесь выбрано "974" Значение, указанное
В моем ответе выбранная страна теперь qatar.in С# как ниже
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 });
}
}
Почему вы пытаетесь установить значение после создания списка? Я предполагаю, что вы создаете список в своей модели, а не в своем представлении. Я рекомендую создать базовое перечисляемое в вашей модели, а затем использовать его для создания фактического SelectList:
<%= Html.DropDownListFor(m => m.SomeValue, new SelectList(Model.ListOfValues, "Value", "Text", Model.SomeValue)) %>
Таким образом, выбранное вами значение всегда устанавливается так же, как и визуализация представления, а не раньше. Кроме того, вам не нужно размещать в своей модели ненужные классы пользовательского интерфейса (например, SelectList), и он может не знать о пользовательском интерфейсе.
Даг ответил на мой вопрос... Но я объясню, в чем была моя проблема, и как Даг помог мне решить мою проблему, с которой вы могли столкнуться.
Я вызываю 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 [i].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);
}
В дополнение к ответу @Womp стоит отметить, что "Where" можно отбросить, а предикат можно поместить непосредственно в "Первый" вызов, например:
list.First(x => x.Value == "selectedValue").Selected = true;
Мне понадобилось выпадающее меню в редактируемой сетке с предварительно выбранными значениями выпадающего списка. 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)); }
Вы можете использовать метод ниже, что довольно просто.
new SelectList(items, "ID", "Name",items.Select(x=> x.Id).FirstOrDefault());
Это автоматически выберет первый элемент в вашем списке. Вы можете изменить указанный выше запрос, добавив предложение where.
Я обычно использую этот метод
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;
}
Мне нужно, чтобы выпадающее меню выбрало подходящее значение id в методе действий. Хитрость заключается в том, чтобы установить свойство Selected при создании коллекции SelectListItem. Это не сработало бы иначе, возможно, я пропустил что-то, но в конце концов, это более элегантно по моему выбору.
Вы можете написать любой метод, который возвращает логическое значение, чтобы установить значение Selected в соответствии с вашими требованиями, в моем случае я использовал существующий Equal Method
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);
}
Приведенный ниже код решает две проблемы: 1) динамически установить выбранное значение раскрывающегося списка и 2) более важно создать раскрывающийся список для индексированного массива в модели. проблема здесь в том, что каждый использует один экземпляр списка выбора, который является ViewBoag.List, в то время как массиву нужен один экземпляр списка выбора для каждого раскрывающегося списка, чтобы можно было установить выбранное значение.
создать переменную ViewBag как List (не SelectList) в контроллере
//код контроллера
ViewBag.Role = db.LUT_Role.ToList();
//в представлении @Html.DropDownListFor(m => m.Contacts [i].Role, новый SelectList (ViewBag.Role, "ID", "Role", Model.Contacts [i].Role))
В случае, если кто-то ищет, я оставил свой ответ от: SelectListItem selected = true не работает в поле зрения
После поиска себя для решения этой проблемы - у меня были некоторые подсказки по пути, но это - решение для меня. Это метод расширения. Я использую MVC 5 С# 4.52 является целью. Приведенный ниже код устанавливает Selection для первого элемента в списке, потому что это то, что мне нужно, вы можете просто пропустить строку и пропустить перечисление - но я также хотел убедиться, что что-то вернулось в мой SelectList из БД)
Extension Method:
открытый статический класс SelectListextensions {
public static System.Web.Mvc.SelectList SetSelectedValue
(этот список System.Web.Mvc.SelectList, строковое значение) { if (значение! = ноль) { var selected = list.Where(x => x.Text == value).FirstOrDefault(); selected.Selected = true;
} список возврата; }
}
И для тех, кто любит полный низ (как я), вот использование. У категории объекта есть поле, определенное как Имя - это поле, которое будет отображаться как Текст в раскрывающемся списке. Вы можете увидеть этот тест для свойства Text в приведенном выше коде.
Example Code:
SelectList categorylist = новый SelectList (dbContext.Categories, "Id", "Name");
SetSelectedItemValue (categorylist);
select list function:
приватный SelectList SetSelectedItemValue (источник SelectList) { Категория категории = новая категория();
SelectListItem firstItem = new SelectListItem();
int selectListCount = -1;
if (source != null && source.Items != null)
{
System.Collections.IEnumerator cenum = source.Items.GetEnumerator();
while (cenum.MoveNext())
{
if (selectListCount == -1)
{
selectListCount = 0;
}
selectListCount += 1;
category = (Category)cenum.Current;
source.SetSelectedValue(category.Name);
break;
}
if (selectListCount > 0)
{
foreach (SelectListItem item in source.Items)
{
if (item.Value == cenum.Current.ToString())
{
item.Selected = true;
break;
}
}
}
}
return source;
}
Вы можете сделать это универсальной функцией/расширением "все включено", но она работает как для меня