ASP.NET MVC4 @ Html.ListBoxFor使用EF的多个数据库

时间:2013-12-07 17:45:55

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 selection

您好我还是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中。感谢

1 个答案:

答案 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将引发异常)。您可以立即手动添加它们,也可以单独添加/编辑页面。