Подтвердить что ты не робот

MVC - установка выбранного значения SelectList

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

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

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

4b9b3361

Ответ 1

Если у вас есть объект 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;

Ответ 2

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

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. Этот получает меня каждый раз.

Надеюсь, это сэкономит кому-то время.

Ответ 3

Просто используйте третий параметр для выбранного значения в 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 });

            }
        }

Ответ 4

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

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

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

Ответ 5

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

Я вызываю 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);

}

Ответ 6

В дополнение к ответу @Womp стоит отметить, что "Where" можно отбросить, а предикат можно поместить непосредственно в "Первый" вызов, например:

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

Ответ 7

Мне понадобилось выпадающее меню в редактируемой сетке с предварительно выбранными значениями выпадающего списка. 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

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

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

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

Ответ 9

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

        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;
    }

Ответ 10

Мне нужно, чтобы выпадающее меню выбрало подходящее значение 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);
        }

Ответ 11

Приведенный ниже код решает две проблемы: 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))

Ответ 12

В случае, если кто-то ищет, я оставил свой ответ от: 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;

}

Вы можете сделать это универсальной функцией/расширением "все включено", но она работает как для меня