2014-01-22 4 views
0

Я пытаюсь сделать очень простой форум, но у меня проблема с DropDownList. У меня есть две модели:MVC4 DropDownList от DB

ForumThread.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> 
} 

И PartialView для ForumCategory:

ForumCategory

@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> 

ForumController

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>'. 
+0

Можете ли вы, возможно, уточнить, что «очевидно, не работает» _? Что происходит, вы получаете какие-либо ошибки? Соответствующий код контроллера также будет полезен для показа. – CodeCaster

+0

Отредактировано с контроллером и ошибкой. Ошибка очевидна, но все же я понятия не имею, как это разрешить. Может быть, есть и другое решение? – Placek

ответ

1

В вашем PartialView для 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; 
} 

0 d, то вы можете иметь вы выпадающий так:

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

Там могут быть и другие ошибки в некоторых частях кода, я просто ответил на тот, который вы цитируемого

+0

Вы не хотите получать доступ к базе данных в своей модели. – CodeCaster

+0

Абсолютно ... забыл созданный вами конструктор, который можно легко использовать –

+0

Проблема решена. Спасибо. – Placek

0

В вашем editortemplate, вы:

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?.