2009-12-20 157 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來引用它,並創建實例您的編輯操作中。

查看由工具創建的默認強類型索引視圖。

相關問題