我正在尝试使用.net 4.5,Entity 5,MVC 4创建一个简单的多模型表单
根据我看到的示例,我希望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
编辑:
如果我从Tasks.cshtml中取出IEnumerable并将其替换为
@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 :(得分:2)
在Home/EditorTemplates/Tasks.cshtml
中,模型为IEnumerable
但是,为了呈现文本框,您不会遍历列表。
当您尝试访问Title
属性时,不确定您是如何收到运行时错误的,因为IEnumerable<MvcApplication5.Models.Task>
答案 1 :(得分:1)
您对模板的理解有点偏差,所以让我看看我是否可以提供帮助。
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)