我知道我可以在我的控制器中设置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>
我真的很感激任何帮助 - 谢谢!
答案 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,您需要花一些时间研究那里的工具,以帮助您生成所需的东西。使用这些工具是开始使用和查看如何操作的好方法。然后,您可以根据心脏的内容调整输出。