【问题标题】:MVC4 DropDownList from DB来自 DB 的 MVC4 DropDownList
【发布时间】:2014-01-22 12:53:18
【问题描述】:

我正在尝试制作非常简单的论坛,但 DropDownList 有问题。我有两个模型:

论坛线程.cs

public partial class ForumThread
{
    public ForumThread()
    {
        this.ForumCategory = new HashSet<ForumCategory>();
    }

    public int TH_ID { get; set; }
    public System.DateTime DATE { get; set; }
    public string TOPIC { get; set; }
    public string USER { get; set; }

    public virtual ICollection<ForumCategory> ForumCategory { get; set; }
}

ForumCategory.cs

public partial class ForumCategory
{
    public ForumCategory()
    {
        this.ForumThread = new HashSet<ForumThread>();
    }

    public int CA_ID { get; set; }
    public string CATEGORY { get; set; }
    public bool isSelected { get; set; }

    public virtual ICollection<ForumThread> ForumThread { get; set; }
}

我尝试使用视图制作“创建”功能:

创建

@model AnimeWeb.Models.ForumThread

@{
ViewBag.Title = "Create";
}

<h2>New Thread</h2>

@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>

    <div class="editor-field">
        @Html.HiddenFor(model => model.TH_ID)
    </div>

    <div class="editor-label">
        TOPIC
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.TOPIC)
        @Html.ValidationMessageFor(model => model.TOPIC)
    </div>
    <div class="editor-label">
        CATEGORY
    </div>
    <div class="editor-field">
       @Html.EditorFor(model => model.ForumCategory)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

以及 ForumCategory 的 PartialView:

论坛类别

@model AnimeWeb.Models.FORUMCATEGORY

@Html.HiddenFor(model => model.CA_ID)
@Html.HiddenFor(model => model.CATEGORY)

<div>
@Html.DropDownListFor(item => Model.CA_ID, ViewBag.CA_ID as SelectList, "-- Select --")
</div>

论坛控制器

public ActionResult Create()
    {
        var db = new MainDatabaseEntities();

        var viewModel = new ForumThread
        {
            ForumCategory = db.ForumCategory.Select(c => new { CA_ID = c.CA_ID, CATEGORY = c.CATEGORY, isSelected = false }).ToList().Select(g => new ForumCategory
            {
                CA_ID = g.CA_ID,
                CATEGORY = g.CATEGORY,
                isSelected = false
            }).ToList(),
        };


        return View(viewModel);
    }

    //
    // POST: /Forum/Create

    [HttpPost]
    public ActionResult Create(ForumThread forumthread, String user, int id)
    {
        var db = new MainDatabaseEntities();
        var newthread = new ForumThread
        {
            TH_ID = forumthread.TH_ID,
            DATE = DateTime.Now,
            TOPIC = forumthread.TOPIC,
            USER = forumthread.USER,
            ForumCategory = new List<ForumCategory>()
        };

        foreach (var selectedCategory in forumthread.FORUMCATEGORY.Where(c => c.isSelected))
        {
            var category = new ForumCategory { CA_ID = selectedCategory.CA_ID };
            db.ForumCategory.Attach(category);
            newthread.ForumCategory.Add(category);
        }

        db.ForumThread.Add(newthread);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

这显然行不通。我试图在这个论坛上使用其他线程,但没有任何帮助。有人可以解释一下如何完成这项工作吗?

错误出现在 ForumCategory 的部分视图中:

The ViewData item that has the key 'CA_ID' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.

【问题讨论】:

  • 您能否详细说明“显然行不通”发生了什么,你有没有遇到任何错误?相关的控制器代码也将很有用。
  • 使用控制器和错误编辑。错误有点明显,但我仍然不知道如何解决这个问题。也许还有其他解决方案?

标签: c# .net asp.net-mvc-4 viewdata asp.net-mvc-partialview


【解决方案1】:

在您的 PartialView for ForumCategory 中,您的演员表不正确:

@Html.DropDownListFor(item => Model.CA_ID, ViewBag.CA_ID as SelectList, "-- Select --")

您必须使用可以在模型中的方法中实现的 SelectList(SelectListItem 列表):

public List<SelectListItem> GetCategories()
{
    var db = new MainDatabaseEntities();
    List<SelectListItem> list = new List<SelectListItem>();

    // Add empty item if needed
    SelectListItem commonItem = new SelectListItem();
    commonItem.Text = "--- Select ---";
    commonItem.Value = "-1";
    commonItem.Selected = true;
    list.Add(commonItem);

    // Add items from Database
    foreach (ForumCategory fc in db.ForumCategory)
    {
        SelectListItem i = new SelectListItem();
        i.Text = fc.CATEGORY;
        i.Value = fc.CA_ID.ToString();
        list.Add(i);
    }
    return list;
}

然后你可以让你这样下拉:

@Html.DropDownList("DropName", Model.GetCategories())

你的代码的某些部分可能还有其他错误,我只是回答了你引用的那个

【讨论】:

  • 您不想访问模型中的数据库。
  • 绝对...忘记了你提到的可以轻松使用的构造函数
【解决方案2】:

在您的编辑器模板中,您有:

ViewBag.CA_ID as SelectList

但是你没有显示你在哪里填充 ViewBag。相反,您可能想做这样的事情:

@Html.DropDownListFor(m => m.CA_ID, 
                      new SelectList(Model.ForumCategory, 
                                     "CA_ID", "CATEGORY", Model.CA_ID))

正如MVC3 DropDownListFor - a simple example? 中所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多