2010-11-16 8 views
12

moim zdaniem wygląda następująco:ASP.NET MVC - Kłopoty przechodzącej modelu w routeValues ​​Html.ActionLink

<%@ 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> 

mojego działania kontrolera:

public ActionResult SortDetails(SearchDataTypeModel model, String sortBy) 
    { 

Model parametr ma wartość null. Parametr sortBy zostanie wypełniony. Mogę bez problemu przekazać właściwość String z modelu do akcji. Chciałbym jednak przekazać cały model.

Jakieś pomysły, co robię źle?

Odpowiedz

3

Inną opcją jest utrwalenie danych, których potrzebujesz w TempData. Spowoduje to przekazanie do następnego żądania i możesz je tam odzyskać. Powinieneś być w stanie utrzymywać cały obiekt modelu, jeśli chcesz.

Ale łatwiej jest (i lepiej ćwiczyć) po prostu odzyskać go ponownie z bazy danych, jak sugeruje Darin.

+1

TempData powinien być używany tylko wtedy, gdy po nim następuje przekierowanie po zapisaniu i pobraniu z TempData w przekierowanej akcji. Nie użyłbym tego w tym scenariuszu. –

17

Nie można przechodzić skomplikowanych obiektów:

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

model = Model nie ma sensu i nie mogą być wysyłane za pomocą GET. Może być konieczne użycie formularza z szablonem edytora i/lub ukrytych pól, aby wysłać wszystkie właściwości modelu. Pamiętaj, że tylko wartości skalarne mogą być wysyłane w ciągu zapytania (klucz1 = wartość1 & klucz2 = wartość2 ...). Inną alternatywą, która przychodzi do głowy to wysłać tylko ID:

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

a twoje działanie kontroler pobrać ze wzorem podanym ten identyfikator z magazynu danych:

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

Oczywiście jest to prawdą tylko wtedy, gdy użytkownik nie powinien edytować właściwości modelu w formularzu. Zależy od twojego scenariusza.

W celu uzupełnienia pozwól mi wyświetlić inną opcję: użyj pomocnika Html.Serialize z MVC Futures do serializacji całego modelu do ukrytego pola, które może być przekazane do działania kontrolera i deserialized tam.

+0

Więc w zasadzie proste tylko parametry ciąg? –

+3

Yeap, proste łańcuchy, tak działa protokół HTTP. Inną alternatywą jest wysłanie tylko identyfikatora, aw akcji kontrolera użycie repozytorium w celu pobrania modelu z tego identyfikatora ze składnicy danych. –

+0

@Darin, dla modelId = Model.Id, co jeśli Id jest na liście (innego modelu) wewnątrz modelu? Podobnie jak @ Html.DisplayFor (model => model.innerModel [i] .Name) i teraz trzeba przekazać wewnętrzny obiekt modelu dla ", false) });