繁体   English   中英

ASP.NET MVC4 @ Html.ListBoxFor使用EF到DB的多重

[英]ASP.NET MVC4 @Html.ListBoxFor Multiple to DB using EF

嗨,我还是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选择框的第一项存储到数据库中。 你能告诉我我做错了什么吗? 我想将所有选定的项目存储到数据库中。 谢谢

由于要选择多个列表框值,因此必须将模型的属性定义为

public virtual ICollection<Interest> Interests { get; set; } 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实体生成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将引发异常)。 您可以暂时手动添加它们,也可以编写单独的添加/编辑页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM