在ASP.NET MVC中将复杂对象从视图传递到控制器/视图

时间:2009-12-20 21:34:24

标签: asp.net-mvc data-binding

在我的MVC应用程序中,我遇到了将数据从视图传递到控制器的问题。我有相当复杂的域类:

public class TaskBase : PersistableObject
{
    public virtual TaskCategory Category { get; set; }
    public virtual IList<TaskNote> Notes { get; set; }
    public virtual string TaskTitle { get; set; }
    public virtual string TaskBody { get; set; }
    public virtual DateTime? CreationTime { get; set; }
    public virtual User CreatedBy { get; set; }
    public virtual int CompletionRatio { get; set; }
}

public class MainTask : TaskBase
{
    public virtual IList<TaskBase> ChildTasks { get; set; }
    public virtual User AssignedTo { get; set; }
    public virtual IList<TaskHistory> History { get; set; }
}

public class TaskFormModel : ViewDomainBase
{
    public MainTask Task { get; set; }
    public LoginForm LoginInfo { get; set; }
}

在我看来,我想将TaskFormModel的实例传递给控制器​​。

<%= Html.ActionLink<TaskController>("Edit Task", (x) => x.Edit(new TaskFormModel() { Task = item, LoginInfo = Model.LoginInfo }))%>

这是控制器动作:

public ActionResult Edit (TaskFormModel taskInfo)
{
    return View(ViewPageName.TaskDetailsForm, task.Task);
}

在此操作方法中,即使从视图传递非null实例,taskInfo也为null。我想我在这里遇到了绑定问题。我认为,编写自定义模型绑定器需要转换每个属性,并且当添加新字段时,还应该更改绑定器类,因此我不希望自定义模型绑定器执行此操作。在这种情况下,还有其他方法可以将数据传递给控制器​​吗?或者可以对自定义模型绑定器进行编码,以便编写更少的代码,并且在添加新属性时,不需要更改绑定器类?

评论后编辑:我想要实现的基本上是将实例从一个视图传递到另一个视图,而不是在我的控制器操作中查询存储库/数据库。

2 个答案:

答案 0 :(得分:4)

答案的第一个版本:

您的GET编辑方法应该是:

public ActionResult Edit (int id)
{
    var model = taskRepository.GetTaskEditModel(id);
    return View(ViewPageName.TaskDetailsForm, model);
}

和ActionLink:

<%= Html.ActionLink("Edit Task", "Edit", "Task", new { model.Task.id })%>

如果要将复杂对象传递给控制器​​,则应将其以html格式包装并传递给POST操作。

答案 1 :(得分:1)

在我看来,你做错了什么。 据我了解:您正在尝试实例化一个新对象,将其传递给浏览器并将其恢复。 好吧,你不能。

如果您要编辑的对象已经存在于您的存储中,那么您应该更改ActionLink以通过id引用它,并在Edit操作中对其进行实例化。

查看由工具创建的默认强类型索引视图。