2011-10-14 12 views
12

Devo creare un collegamento basato sui miei criteri di ricerca. Per esempio:Posso passare un modello di vista al link azione per generare un percorso?

localhost/Search?page=2&Location.PostCode=XX&Location.Country=UK&IsEnabled=true 

parametri in questo link sono i valori delle proprietà nella mia SearchViewModel.

Idealmente mi piacerebbe avere qualcosa sulle linee di:

@Html.ActionLink("Search","User", Model.SearchCriteria) 

È questo supportata di default o devo passare proprietà del mio modello di vista nel tipo di oggetto RouteValueDictionary e quindi utilizzare tale?

Il mio obiettivo è scrivere un helper di paging che generi numeri di pagina e aggiunga i parametri dei criteri di ricerca ai collegamenti generati.

E.g.

@Html.GeneratePageLinks(Model.PagingInfo, x => Url.Action("Index"), Model.SearchCriteria) 

ho combinato vostre soluzioni con suggerimento PRO ASP.NET MVC 3 book e si è conclusa con la seguente:

Helper per la generazione di link. parte interessante è il parametro pageUrlDelegate che viene poi utilizzato per richiamare Url.Action per i collegamenti che generano:

public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfoViewModel pagingInfo, 
             Func<int,String> pageUrlDelegate) 
{ 
    StringBuilder result = new StringBuilder(); 
    for (int i = 1; i <= 5; i++) 
    { 
     TagBuilder tagBuilder = new TagBuilder("a");         
     tagBuilder.MergeAttribute("href", pageUrlDelegate(i)); 
     tagBuilder.InnerHtml = i.ToString(); 
     result.Append(tagBuilder.ToString());    
    }    

    return MvcHtmlString.Create(result.ToString()); 
} 

Poi nel modello di visualizzazione:

@Html.PageLinks(Model.PagingInfo, x => Url.Action("Index","Search", new RouteValueDictionary() 
    { 
      { "Page", x }, 
      { "Criteria.Location.PostCode", Model.Criteria.Location.PostCode }, 
      { "Criteria.Location.Town", Model.Criteria.Location.Town}, 
      { "Criteria.Location.County", Model.Criteria.Location.County} 
    })) 
) 

Non sono ancora felice con i nomi di proprietà in stringhe, ma per ora lo dovrò fare.

Grazie :)

risposta

10

Idealmente mi piacerebbe avere qualcosa sulle linee di:

@Html.ActionLink("Search","User", Model.SearchCriteria)

Purtroppo questo non è possibile. Dovrai passare le proprietà una per una. Si potrebbe infatti utilizzare il sovraccarico che prende un RouteValueDictionary:

@Html.ActionLink(
    "Search", 
    "User", 
    new RouteValueDictionary(new Dictionary<string, object> 
    { 
     { "Location.PostCode", Model.SearchCriteria.PostCode }, 
     { "Location.Country", Model.SearchCriteria.Country }, 
     { "IsEnabled", Model.IsEnabled }, 
    }) 
) 

Naturalmente è probabilmente meglio scrivere un aiutante ActionLink personalizzato per fare questo:

public static class HtmlExtensions 
{ 
    public static IHtmlString GeneratePageLink(this HtmlHelper<MyViewModel> htmlHelper, string linkText, string action) 
    { 
     var model = htmlHelper.ViewData.Model; 
     var values = new RouteValueDictionary(new Dictionary<string, object> 
     { 
      { "Location.PostCode", model.SearchCriteria.PostCode }, 
      { "Location.Country", model.SearchCriteria.Country }, 
      { "IsEnabled", model.IsEnabled }, 
     }); 
     return htmlHelper.ActionLink(linkText, action, values); 
    } 
} 

e poi:

@Html.GeneratePageLink("some page link text", "index") 

Un'altra possibilità è quella di passare solo il id e fare in modo che l'azione del controller prelevi il modello e i valori corrispondenti da qualsiasi punto lo si preleva inizialmente nel control azione ller che ha reso questa vista.

+0

Hi Darin, grazie per la vostra risposta. Probabilmente userò il tuo secondo consiglio e creerò un aiuto per generare link di pagina. –

+0

Si prega di vedere la modifica –

1

Ecco un codice preso da Steve Sanderson Tekpub samples che è ampiamente quello che stai cercando.In primo luogo definire un metodo di estensione sul vostro oggetto -

public static RouteValueDictionary DetailsRouteValues(this JobAd jobAd) 
{ 
    return new RouteValueDictionary 
    { 
     { "controller", "Jobs" }, 
     { "action", "Details" }, 
     { "id", jobAd.JobAdId }, 
     { "country", MakeSimpleUrlSegment(jobAd.LocationCountry) }, 
     { "city", MakeSimpleUrlSegment(jobAd.LocationCity) }, 
     { "title", MakeSimpleUrlSegment(jobAd.Title) } 
    }; 
} 

quindi chiamare Html.RouteLink utilizza lo stesso metodo -

<%= Html.RouteLink(ad.Title, ad.DetailsRouteValues())%> 
+0

Ciao, grazie per una soluzione alternativa. Devo decidere se è giusto per me estendere i miei criteri di ricerca con un metodo per restituire i valori del percorso. Mi piace mantenere i miei modelli di vista lite. –

Problemi correlati