Выбор значения по умолчанию в DropDownList для html-помощника не работает - ASP .NET MVC - PullRequest
0 голосов
/ 11 декабря 2018

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

Вот мой контроллер:

public ActionResult Index(int accountType)
        {
            List<SelectListItem> listItems = new List<SelectListItem>
            {
                new SelectListItem{Text = "Competitor",Value = "Competitor"},
                new SelectListItem{Text = "Consultant",Value = "Consultant"},
                new SelectListItem{Text = "Customer",Value = "Customer"},
                new SelectListItem{Text = "Investor",Value = "Investor"},
                new SelectListItem{Text = "Partner",Value = "Partner"},
                new SelectListItem{Text = "Influencer",Value = "Influencer"},
                new SelectListItem{Text = "Press",Value = "Press"},
                new SelectListItem{Text = "Prospect",Value = "Prospect"},
                new SelectListItem{Text = "Reseller",Value = "Reseller"},
                new SelectListItem{Text = "Supplier",Value = "Supplier"},
                new SelectListItem{Text = "Vendor",Value = "Vendor"},
                new SelectListItem{Text = "Other",Value = "Other"}
            };

            Account account = new Account
            {
                Name = "khaled",
                Email = "test",
                AccountType = listItems[accountType].Text
            };
            ViewBag.items = listItems;
            return View(account);
        } 

My View: @using System.Globalization @model Form_Task.Models.Account

<div class="form-group">
       @Html.Label("accounttype", "Account Type")
       @Html.DropDownListFor(Model=>Model.AccountType,(List<SelectListItem>)ViewBag.items,new{@class = "form-control", @disabled="disabled"})
</div>

Моя модель:

public class Account
    {
        public string Name { get; set; }
        public string Email { get; set; }
        public string AccountType { get; set;}
    }

Если я изменю accountType на строку и создаю модель, как показано ниже, она отлично работает:

Account account = new Account
                {
                    Name = "khaled",
                    Email = "test",
                    AccountType = accountType
                };

1 Ответ

0 голосов
/ 11 декабря 2018

Из вашего комментария звучит так, как будто вы хотите установить выбранное значение на основе его позиции в списке ... Если вам нужно, то этот код, прежде чем передать его в пакет просмотра, будет работать.

        Account account = new Account
        {
            Name = "khaled",
            Email = "test",
            AccountType = listItems[accountType].Text
        };

        listItems[accountType].Selected = true;//Add this line
        ViewBag.items = listItems;
        return View(account);

Однако это не очень хороший способ сделать что-то, что произойдет, если порядок изменится?Что произойдет, если int, которое вы получите из строки запроса, будет больше, чем длина listItems?

Более типичным методом является установка selected на основе значения вашего SelectListItem, что-тонапример:

public ActionResult Index(string accountType)//pass through the listitems value instead of its position in the list.
{
    List<SelectListItem> listItems = new List<SelectListItem>
        {
            new SelectListItem{Text = "Competitor",Value = "Competitor"},
            new SelectListItem{Text = "Consultant",Value = "Consultant"},
            new SelectListItem{Text = "Customer",Value = "Customer"},
            new SelectListItem{Text = "Investor",Value = "Investor"},
            new SelectListItem{Text = "Partner",Value = "Partner"},
            new SelectListItem{Text = "Influencer",Value = "Influencer"},
            new SelectListItem{Text = "Press",Value = "Press"},
            new SelectListItem{Text = "Prospect",Value = "Prospect"},
            new SelectListItem{Text = "Reseller",Value = "Reseller"},
            new SelectListItem{Text = "Supplier",Value = "Supplier"},
            new SelectListItem{Text = "Vendor",Value = "Vendor"},
            new SelectListItem{Text = "Other",Value = "Other"}
        };

        //loop through and check for a match
        foreach (var item in listItems)
        {
            item.Selected = item.Value == accountType;
        }

        Account account = new Account
        {
            Name = "khaled",
            Email = "test",
            AccountType = listItems[accountType].Text
        };
        ViewBag.items = listItems;
        return View(account);
} 

Таким образом, если значение не соответствует вашей строке запроса, оно не вызовет исключение, и ваш метод все равно будет завершен.

Редактировать - только что заметил васвы используете @Html.DropDownListFor(), измените его на @Html.DropDownList() или просто html5 control, иначе атрибут Selected игнорируется.

<div class="form-group">
   @Html.Label("accounttype", "Account Type")
   <select name="AccountType" class="form-control" disabled="disabled">
       @foreach(var item in (List<SelectListItem>)ViewBag.items)
       {
       <option value='@item.Value' @(item.Selected ? "selected" : "")>@item.Text</option> 
       }
   </select>
</div>
...