2014-12-18 2 views
2

Имея некоторые проблемы с пониманием того, как создавать и редактировать коллекцию строк с использованием формы. Я пробовал использовать EditorFor, но, похоже, ему не повезло и вместо этого вносит следующий текст в форму. Я пытаюсь редактировать коллекцию «Ключевые слова».Создание и редактирование коллекции строк с использованием MVC3

System.Collections.Generic.HashSet`1[MVCModuleStarter.Models.Module]System.Collections.Generic.HashSet`1[MVCModuleStarter.Models.Module] 

Это Html я использую EditorFor в с рабочим EditorFor используется на шнурке для справки.

<div class="form-group"> 
      @Html.LabelFor(model => model.Category, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Category, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Category, "", new { @class = "text-danger" }) 
      </div> 
     </div> 


     <div class="form-group"> 
     @Html.LabelFor(model => model.Keywords, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Keywords, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.Keywords, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

Это метод Edit внутри моего контроллера;

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit([Bind(Include = "ModuleId,ModuleTitle,ModuleLeader,ModuleDescription,ImageURL,Category,Keywords")] Module module) 
     { 
      if (ModelState.IsValid) 
      { 
       int moduleId = module.ModuleId; 
       repository.UpdateModule(module); 
       repository.Save(); 
       return RedirectToAction("Details", new { Id = moduleId }); 
      } 
      return View(module); 
     } 

Это Модель для справки;

[Required, StringLength(20), Display(Name = "Category")] 
     public string Category { get; set; } 

     public virtual ICollection<Keyword> Keywords { get; set; } 

Модель Ключевое слово

public class Keyword 
    { 
     [Key, Display(Name = "ID")] 
     public int KeywordId { get; set; } 

     [Required, StringLength(100), Display(Name = "Keyword")] 
     public string KeywordTerm { get; set; } 

     public virtual ICollection<Module> Modules { get; set; } 
    } 
} 

Любая помощь будет удивительно, все еще новичок в этом! Благодаря!

+0

Вам нужно создать 'EditorTemplate' для TYPEOF' Keyword' или использовать 'for' петлю, чтобы сделать каждое свойство' Keyword' но вам нужно разместить модель для 'Keyword', если вам нужна дальнейшая помощь –

+0

@StephenMuecke Просто добавила модель для ключевого слова внизу, я думаю, что я правильно слежу за вами, но дальнейшая помощь будет оценена! Благодаря! – HotLovingCoder3

ответ

0

Вам нужно создать EditorTemplate для Keyword, например

В /Views/Shared/EditorTemplates/Keyword.cshtml (добавить дивы, имена классов и т.д., как требуется)

@model Keyword 
@Html.HiddenFor(m => m.KeywordId) 
@Html.LabelFor(m => m.KeywordTerm) 
@Html.TextBoxFor(m => m.KeywordTerm) 
@Html.ValidationMessageFor(m => m.KeywordTerm) 

Затем в главном окне

Html.EditorFor(m=> m.Keywords) 

Примечание. Я опустил свойство коллекции Modules, но если вы также хотите отредактировать их, добавьте еще EditorTemplate для Modules

В качестве альтернативы вы можете использовать петлю for на главном экране. Это будет означать, что коллекция должна быть IList<T>

for(int i = 0; i < Model.Keywords.Count, i++) 
{ 
    @Html.HiddenFor(m => m.Keywords[i].KeywordId) 
    // other properties of Keyword 
    for (int j = 0; j < Model.Keywords[i].Modules.Count; j++) 
    { 
    @Html.TextBoxFor(m => m.Keywords[i].Modules[j].SomeProperty) 
    // other properties of Module 
    } 
} 
+0

'ICollection ' не имеет индексатора, поэтому не уверен, как должно работать 'm.Keywords [i]' (ожидая, что это будет 'IList '?) –

+0

@BradChristie, Да, если вы используете 'for 'loop нужно было бы' IList ' –

Смежные вопросы