使用EditorFor在一个表单中的多个模型

时间:2013-10-07 22:15:47

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

我正在尝试使用.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'.

2 个答案:

答案 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)