您好我还是MVC4的新手,我想使用HTML帮助程序创建一个选择框,允许用户使用CTRL选择多个项目使用EF单击并存储结果。这是我的观点
@model AtomicQuestionnaire.Models.Questionnaire
@{
ViewBag.Title = "Create";
}
@{
var ListInterest = new List<SelectListItem>()
{
new SelectListItem(){Value="Stamp Collecting",Text="Stamp Collecting"},
new SelectListItem(){Value="Listening to Music",Text="Listening to Music"},
new SelectListItem(){Value="Reading",Text="Reading"}
};
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div class="editor-label">
@Html.LabelFor(model => model.Interest)
</div>
<div class="editor-field">
@Html.ListBoxFor(model => model.Interest, ListInterest, new { size = "15", Multiple = "multiple" })
@Html.ValidationMessageFor(model => model.Interest)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
这是我的模特
public class Questionnaire
{
public int ID { get; set; }
public string Name { get; set; }
public string City { get; set; }
public string VisitorDesc { get; set; }
public string Interest { get; set; }
public int SiteRating { get; set; }
}
和我的创建动作控制器
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Questionnaire questionnaire)
{
if (ModelState.IsValid)
{
db.Questionnaires.Add(questionnaire);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(questionnaire);
}
我只能将html选择框的第一项存储到数据库中。你能告诉我我做错了什么吗?我想将所有选定的项目存储到DB中。感谢
答案 0 :(得分:1)
由于您要选择多个列表框值,您必须将模型的属性定义为
public virtual ICollection<Interest> Interests { get; set; }
,
不是
public string Interest { get; set; }
如果Interests
属性是集合,则需要一个单独的表来存储它们(EF级别的单独实体)。
public class Interest
{
public int ID { get; set; }
public string Title { get; set; }
public virtual ICollection<Questionnaire> Questionnaires { get; set; }
}
对于那些实体,EF将生成Interests
表和一个存储问卷 - 兴趣关联的联结表。
观点:
@{
var ListInterest = new List<SelectListItem>() //hard-code, better load interests from db
{
new SelectListItem(){ Value = 1, Text="Stamp Collecting" },
new SelectListItem(){ Value=2, Text="Listening to Music" },
new SelectListItem(){ Value=3, Text="Reading"}
};
Html.ListBoxFor(c => c.Interests,
new MultiSelectList(ListInteres, "Value", "Text"))
注意,兴趣实体必须存在于db中(或SaveChanges
将引发异常)。您可以立即手动添加它们,也可以单独添加/编辑页面。