2009-12-20 147 views
3

在我的MVC应用程序,我有一个从视图传递数据到控制器的问题。我有相当复杂的域类:将复杂的对象从视图传递到控制器/视图在ASP.NET 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); 
} 

在这种操作方法TASKINFO自带空,即使我通过非空实例的视图。我想我在这里有一个有约束力的问题。我认为,编写自定义模型联编程序需要转换每个属性,并且在添加新字段时还应该更改联编程序类,因此我不希望自定义模型联编程序执行此操作。在这种情况下是否有其他方式将数据传递给控制器​​?或者可以编写自定义模型联编程序,以便编写更少的代码,并且在添加新的特性时,联编程序类将不需要更改?

编辑之后的评论:我想实现的基本上是将一个实例从一个视图传递到另一个视图,而无需在控制器的操作中查询repository/db。

+0

@arh,当你传递对象时,你为什么不想回到db?我个人更喜欢这种方法,因为它可以保持一切。我只能通过身份证。 Lot的流量也较少。 – griegs 2009-12-20 23:49:59

回答

4

回答的第一个版本:

你获取编辑方法应该是这样的:

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操作。

+0

我相信@ arch的编辑行为是正确的。他将整个对象传递给ActionResult。我以前完全一样。问题中不清楚的是首先如何将任务交给视图。无论他将对象传递给编辑动作还是进行查找。如果是查找,那么你的回答就是立场,如果不是的话,那么他的一切都很好。 – griegs 2009-12-20 22:15:03

+0

问题不够清楚。很高兴知道作者想要达到什么目的。他还可以用[HttpGet]或[HttpPost]属性来装饰动作。 – LukLed 2009-12-20 22:20:42

+0

耶同意了。他可以用HttpPost装饰,但是在他提供的代码中并不需要,但是就像你说的那样,目前还不清楚。 – griegs 2009-12-20 22:27:19

0

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

如果你想编辑的对象在存储中已经存在,那么你应该改变你的ActionLink通过ID来引用它,并创建实例您的编辑操作中。

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

相关问题