2013-10-07 3 views
0

Я пытаюсь создать простую форму нескольких моделей с использованием .net 4.5, Entity 5, MVC 4Несколько моделей в одной форме с использованием EditorFor

Основываясь на примерах, которые я видел, я ожидаю EditorTemplates \ Tasks.cshtml быть визуализируется дважды, один раз для каждой задачи в проекте, но он только появляется, чтобы получить один раз и передать коллекцию задач, с которыми я, похоже, не могу работать.

Любые идеи? Мои классы/представления перечислены ниже.

Задача:

public partial class Task 
{ 
    public Task() 
    { 
     this.TaskPeople = new HashSet<TaskPerson>(); 
    } 

    public int Id { get; set; } 
    public string Title { get; set; } 
    public int ProjectId { get; set; } 

    public virtual Project Project { get; set; } 
    public virtual ICollection<TaskPerson> TaskPeople { get; set; } 
}  

Проект:

public partial class Project 
{ 
    public Project() 
    { 
     this.Tasks = new HashSet<Task>(); 
    } 

    public int Id { get; set; } 
    public string Title { get; set; } 

    public virtual ICollection<Task> Tasks { get; set; } 
} 

HomeController.New():

public ActionResult New() 
{ 
    Project project = new Project(); 
    project.Tasks.Add(new Task() { }); 
    project.Tasks.Add(new Task() { }); 
    return View(project); 
} 

Главная/New.cshtml:

@using (Html.BeginForm("Create", "Home", FormMethod.Post)) 
{  
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary()  
    @Html.LabelFor(m => m.Title)  
    @Html.EditorFor(m => m.Tasks, "Tasks") 
    <input type="submit" value="Save" /> 
} 

Главная/EditorTemplates/Tasks.cshtml

@model IEnumerable<MvcApplication5.Models.Task> 

@Html.TextBoxFor(m => m.Title) // Error Here 

EDIT:

Если я IEnumerable из Tasks.cshtml и заменить его

@model MvcApplication5.Models.Task 

я получаю следующее исключение:

The model item passed into the dictionary is of type 'System.Collections.Generic.HashSet`1[MvcApplication5.Models.Task]', but this dictionary requires a model item of type 'MvcApplication5.Models.Task'. 
+0

tasks.cshtml не должны быть IEnumerable просто Задача - просто положить базовый тип и движок бритвы будут отображать список m.Tasks - это то, как шаблоны предназначены для работы. И измените имя шаблона на Task.cshtml, как оно соответствует типу.Это также обеспечит правильную индексацию идентификаторов полей формы для перехода к контроллеру. – Rob

ответ

2

Home/EditorTemplates/Tasks.cshtml, модель IEnumerable Однако, чтобы отобразить текстовое поле, вы не перебираете список.

Не знаю, как вы не получаете сообщение об ошибке во время выполнения, когда вы пытаетесь получить доступ к Title собственности, поскольку это свойство не существует в IEnumerable<MvcApplication5.Models.Task>

+0

На самом деле я получаю сообщение об ошибке, обновленный код просмотра выше, чтобы показать это –

+0

Я не смог получить TextBoxFor для работы внутри цикла. –

0

Ваше понимание шаблонов поодаль, поэтому позвольте мне увидеть если я могу помочь.

Помощники Html.Display* и Html.Editor* могут распознать, когда вы передаете им коллекцию. Вместо того, чтобы вам перебирать эту коллекцию, эти методы будут неоднократно вызывать шаблон для базового типа коллекции для каждого элемента этой коллекции.

На простом английском языке, если вы передаете List<Car> к одному из этих методов, если Car.cshtml шаблона существует, то он будет постоянно ссылаться на этот шаблон для каждого Car в этом списке. В вашем случае это означает, что изменения кода на что-то вроде следующего:

@using (Html.BeginForm("Create", "Home", FormMethod.Post)) 
{  
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary()  
    @Html.LabelFor(m => m.Title)  
    @Html.EditorFor(m => m.Tasks) 
    <input type="submit" value="Save" /> 
} 

Тогда шаблон Task.cshtml:

@model MvcApplication5.Models.Task 

@Html.TextBoxFor(m => m.Title) 
+0

Спасибо, Джон. Я ожидал, что он будет работать так, как вы только что описали, но я получаю исключение: элемент модели, переданный в словарь, имеет тип «System.Collections.Generic.HashSet'1 [MvcApplication5.Models.Task]», но для этого словаря требуется элемент модели типа «MvcApplication5.Models.Task» –

+0

@recursive_acronym Я просто попытался использовать вашу точную модель и код контроллера с шаблоном, который я определил выше, и он работает правильно. –

+0

Вы оставили инициализатор как Hashset? –

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