【问题标题】:ASP.NET MVC4 @Html.ListBoxFor Multiple to DB using EFASP.NET MVC4 @Html.ListBoxFor Multiple to DB 使用 EF
【发布时间】:2013-12-07 17:45:55
【问题描述】:

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

【问题讨论】:

  • 不应该是您处理的问卷的集合,而不仅仅是一个对象吗?
  • 感谢任何建议/更正,因为我对 .Net 世界还很陌生。谢谢。
  • 试试看这个:stackoverflow.com/questions/18104110/… 看看它是否能有所启发:)

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


【解决方案1】:

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

public virtual ICollection&lt;Interest&gt; 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 将引发异常)。您现在可以手动添加它们或编写单独的添加/编辑页面。

【讨论】:

  • 感谢您的帮助。我试过了,但没有存储任何列表框值。我从 app-data 中删除了连接和 db 文件并重新构建。并发现根本没有创建 DB 列 Interest。
  • 我的错,忘了分贝。集合属性不能存储在单个列中,您需要为它们创建一个单独的表。请查看我的更新。
  • 再次感谢。我应该如何从以下内容适当地更新视图。对不起,noobish 问题
    @Html.ListBoxFor(model => model.Interest, ListInterest) @Html.ValidationMessageFor(model => model.Interest)
  • 另外,为了简单起见,有没有办法将所有选定的选项连接为一个字符串并存储在字符串字段而不是集合中?谢谢。
  • 当然,你可以这样做: 1)在模型中声明ICollection&lt;string&gt;属性。它不会被保存(因为 EF 不会将集合保存在单列中),但仍然会被绑定。但随后您将需要一个属性来存储连接值并将其传递给 db。 (类似model.InterestsConcatenated = string.Join(",", Model.Interests);)或者,您可以将域模型与视图模型分开。 2) 直接从Request.Form 获取值并将它们连接到单个字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多