Не могу установить SelectedItem в DropDownList в моем представлении MVC3 - PullRequest
1 голос
/ 22 августа 2011

Я знаю, что могу установить SelectedItem в моем контроллере, но я не могу понять, как установить его в моем представлении. Я работаю над своего рода приложением с помощью карточки (учебное пособие) и импортировала около 400 тестовых вопросов. Теперь я хочу написать страницу для инструктора, чтобы иметь возможность выбрать «категорию» для каждого вопроса. Я бы хотел, чтобы они могли обновлять категорию по всем вопросам на одной странице. В моей модели есть объект с вопросом, который содержит поле внешнего ключа для объекта категории (поле называется QuestionCategory). Итак, мое представление основано на объекте «Вопрос», но я отправляю список категорий (их 14) в ViewBag (поэтому мне не нужно отправлять полный список SelectList с каждым из 400 вопросов. мое представление перебирает элементы моего представления, я просто хочу добавить список SelectList, содержащий 14 категорий в моем ViewBag, а затем установить SelectedItem на основе значения item.QuestionCategory. Я не могу заставить его работать.

Вот мое действие контроллера:

    public ActionResult Index()
    {
        var context = new HBModel.HBEntities();
        var query = from q in context.tblQuestions.Include("tblCategory") select q;
        var questions = query.ToList();

        ViewBag.Categories = new SelectList(context.tblCategories, "CategoryID", "CategoryName"); 

        return View(questions);
    }

Вот некоторые вещи, которые я пробовал в представлении (с соответствующими сообщениями об ошибках в комментариях)

@model IEnumerable<HBModel.tblQuestion>

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            Question
        </th>
        <th>
            Answer
        </th>
        <th>
            AnswerSource
        </th>
        <th>
            Category
        </th>
        <th>
            Action
        </th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @item.Question
        </td>
        <td>
            @item.Answer
        </td>
        <td>
            @item.AnswerSource
        </td>
        <td>
            @item.tblCategory.CategoryName 

            @*This one works, but cannot initialize the selected item to be current database value*@
            @Html.DropDownList("Categories")

            @*compile error - CS0200: Property or indexer 'System.Web.Mvc.SelectList.SelectedValue' cannot be assigned to -- it is read only*@
            @*@Html.DropDownListFor(m => item.QuestionCategory, (ViewBag.Categories as SelectList).SelectedValue = item.QuestionCategory)*@

            @*error {"DataBinding: 'System.Web.Mvc.SelectListItem' does not contain a property with the name 'CategoryId'."}*@
            @Html.DropDownListFor(m => item.QuestionCategory, new SelectList(ViewBag.Categories, "CategoryId", "CategoryName"))

            @*error - {"DataBinding: 'System.Char' does not contain a property with the name 'CategoryId'."}*@
            @Html.DropDownListFor(m => item.QuestionCategory, new SelectList("Categories", "CategoryId", "CategoryName"))
)

        </td>
        <td style="width: 100px">
            @Html.ActionLink("Edit", "Edit", new { id = item.QuestionID }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.QuestionID })
        </td>
    </tr>
}

</table>

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

Буду очень признателен за любую помощь в этом - Спасибо!

1 Ответ

1 голос
/ 22 августа 2011

Вам необходимо явно создать опции в теге select, используя @ Html.DropDownList, следующим образом (взято из рабочего приложения):

@Html.DropDownListFor(model => model.IdAccountFrom, ((IEnumerable<FlatAdmin.Domain.Entities.Account>)ViewBag.AllAccounts).Select(option => new SelectListItem {
        Text = (option == null ? "None" : option.AccountName), 
        Value = option.AccountId.ToString(),
        Selected = (Model != null) && (option.AccountId == Model.IdAccountFrom)
    }), "Choose...")
    @Html.ValidationMessageFor(model => model.IdAccountFrom)

Вам, очевидно, нужно изменить свойства вашей @-модели.

Примечание:

Этот код был автоматически сгенерирован пакетом MvcScaffolding NuGet, когда я создал контроллер.

Этот пакет требует от вас использования классов POCO Entity Framework Code First. Их легко сгенерировать из существующей базы данных, используя CTP Entity Framework Power Tools.

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

...