2010-11-16 42 views
12

我的視圖看起來是這樣的:ASP.NET MVC - 故障傳遞模型在Html.ActionLink routeValues

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<TMS.MVC.BusinessSystemsSupport.Models.SearchDataTypeModel>" %> 


<table class="classQueryResultsTable"> 
    <!-- the header --> 
    <tr class="headerRow"> 

     <td> 
     <%= Html.ActionLink("Effective Startdate", 
        "SortDetails", 
        "DataQryUpdate", 
        new 
        { 
         model = Model, 
         sortBy = "EffectiveStartDate", 
        }, 
        new { @class = "classLinkLogDetails" })%> 
     </td> 

    </tr> 


</table> 

我的控制器動作:

public ActionResult SortDetails(SearchDataTypeModel model, String sortBy) 
    { 

模型參數爲空。 sortBy參數被填充。我可以將模型中的String屬性傳遞給沒有問題的動作。我想要通過整個模型。

任何想法我做錯了什麼?

回答

3

另一種選擇是將您需要的數據保存在TempData中。這將把它交給下一個請求,你可以在那裏檢索它。如果需要,您應該可以保留整個模型對象。如Darin所言,但從數據庫中再次檢索它會更容易(也是更好的做法)。

+1

只有在緊接着在重定向操作中存儲並從TempData中獲取重定向之後,才應使用TempData。我不會在這種情況下使用它。 – 2010-11-16 19:01:18

17

您無法通過複雜的對象:

new 
{ 
    model = Model, 
    sortBy = "EffectiveStartDate", 
}, 

model = Model是沒有意義的,不能使用GET發送。您可能需要使用帶有編輯器模板和/或隱藏字段的表單才能發送所有模型屬性。請記住,只能在查詢字符串中發送標量值(key1 = value1 & key2 = value2 ...)。想到的另一種方法是隻發送ID:

new 
{ 
    modelId = Model.Id, 
    sortBy = "EffectiveStartDate", 
}, 

,並在你的控制器動作擷取您的數據存儲給出此標識的型號:

public ActionResult SortDetails(int modelId, String sortBy) 
{ 
    var model = repository.GetModel(modelId); 
    ... 
} 

當然,這是如果只有真用戶不應該編輯表單中的模型屬性。取決於你的情況。

併爲完整起見,讓我露出另一種選擇:使用來自MVC期貨Html.Serialize幫手整個模型序列化到一個隱藏字段,可被傳遞給控制器​​的動作和反序列化存在。

+0

所以基本上簡單的字符串僅參數? – 2010-11-16 18:53:37

+3

Yeap,簡單的字符串,這就是HTTP協議的工作原理。另一種方法是僅發送ID並在控制器操作中使用存儲庫從數據存儲中的此ID獲取模型。 – 2010-11-16 18:54:06