SelectList выбранное значение не переносится в DropDownList - PullRequest
3 голосов
/ 14 февраля 2012

У меня есть страница Razor со раскрывающимся списком внутри формы:

@using (Html.BeginForm("ProductsByOwners", "Report", FormMethod.Post, new { @id = "ProductsByOwners" }))
{            
    @Html.Label("Choose product owner: ")
    @Html.DropDownList("OwnerList", (SelectList)ViewBag.OwnerList, new { @onchange = "this.form.submit();" })    
}

Выбранное значение моего SelectList не переносится на DropDownList.Я отладил и прошел по коду и обнаружил, что (SelectList)ViewBag.OwnerList правильно оценивает и выбрал ожидаемое значение, но в результирующем HTML не выбран ни один из option тегов.Я не так делаю?

ОБНОВЛЕНО

Вот как создается список выбора в моем действии:

ViewBag.OwnerList = new SelectList(ListUtils.ProductOwners(), "Key", "Value", values["OwnerList"]);

Результатзначение указано values["OwnerList"] выбрано.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 14 февраля 2012

Наиболее распространенная причина, по которой выбранный элемент не выбран в DDL, состоит в том, что вы назвали список выбора таким же, как модель. Строго типизированные представления предпочтительнее, но отлично для передачи списка SelectList в Viewbag. См. Мой учебник Работа с DropDownList Box и jQuery и мой блог Каскадный DropDownList в ASP.Net MVC

6 голосов
/ 14 февраля 2012

Вы не используете хелпер DropDownList должным образом. Чтобы создать выпадающий список, вам нужно 2 вещи:

  1. скалярное свойство для привязки к выбранному значению при отправке формы
  2. коллекция для привязки параметров к

В вашем примере у вас есть только одна из этих двух вещей (вторая). Ваш первый аргумент называется OwnerList, и вы получили ViewBag.OwnerList в качестве второго аргумента.

Итак:

@Html.DropDownList(
    "SelectedOwnerId", 
    (SelectList)ViewBag.OwnerList, 
    new { @onchange = "this.form.submit();" }
)

Очевидно, я бы порекомендовал вам использовать строго типизированные представления и модели представления. И, очевидно, избавиться от слабо типизированных ViewBag / ViewData / ViewCrap.

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

public class OwnerViewModel
{
    [DisplayName("Choose product owner: ")]
    public string SelectedOwnerId { get; set; }

    public IEnumerable<SelectListItem> OwnerList { get; set; }
}

затем контроллер:

public class ReportController: Controller
{
    public ActionResult ProductsByOwners()
    {
        var model = new OwnerViewModel
        {
            // preselect the second owner
            SelectedOwnerId = "2",

            // obviously those come from your database or something
            OwnerList = new[] 
            {
                new SelectListItem { Value = "1", Text = "owner 1" },
                new SelectListItem { Value = "2", Text = "owner 2" },
                new SelectListItem { Value = "3", Text = "owner 3" },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult ProductsByOwners(OwnerViewModel model)
    {
        ...
    }
}

и у вас есть соответствующее строго типизированное представление:

@model OwnerViewModel
@using (Html.BeginForm("ProductsByOwners", "Report", FormMethod.Post, new { id = "ProductsByOwners" }))
{            
    @Html.LabelFor(x => x.SelectedOwnerId)
    @Html.DropDownListFor(
        x => x.SelectedOwnerId, 
        Model.OwnerList, 
        new { onchange = "this.form.submit();" }
    )
}
...