无法在我的MVC3视图中的DropDownList中设置SelectedItem

时间:2011-08-22 04:12:59

标签: asp.net-mvc-3 selectlist

我知道我可以在我的控制器中设置SelectedItem,但我无法弄清楚如何在我的视图中设置它。我正在研究一种flashcard(学习指南)应用程序,我已经导入了大约400个测试题。现在我想为教师编写一个页面,以便为每个问题选择一个“类别”。我希望他们能够在一个页面上更新所有问题的类别。我的模型有一个问题实体,它包含类别实体的外键字段(该字段称为QuestionCategory)。因此,我的观点基于问题实体,但是我在ViewBag中发送了类别列表(有14个)(所以我不必在400个问题中发送完整的SelectList。我的视图通过视图中的项目进行迭代,我只想在ViewBag中添加一个包含14个类别的SelectList,然后根据item.QuestionCategory的值设置SelectedItem。我无法使其工作。

这是我的控制器动作:

    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>

当然,如果我可以让它工作,我将需要尝试添加一个动作来回到控制器并更新所有记录,但我很乐意解决我当前的问题。< / p>

我真的很感激任何帮助 - 谢谢!

1 个答案:

答案 0 :(得分:1)

您需要使用@ Html.DropDownList在select标记中显式创建选项,如下所示(取自正在运行的应用程序):

@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)

您显然需要更改@Model上的属性。

注意:

当我搭建一个控制器时,这个代码是由MvcScaffolding NuGet包自动生成的。

此程序包要求您为实体使用Entity Framework Code First POCO类。使用Entity Framework Power Tools CTP可以从现有数据库轻松生成这些数据。

使用MVC,您需要花一些时间研究那里的工具,以帮助您生成所需的东西。使用这些工具是开始使用和查看如何操作的好方法。然后,您可以根据心脏的内容调整输出。