2009-11-27 16 views
16

SearchResults.aspx Modeli PersonSearch; Yeni bir sayfa için istek geldiğinde (bir GET talebi), eylem yöntemi onu almalı ve yeni sonuçları hesaplamalıdır.Bu ActionLink için doğru rota değerlerini nasıl oluştururum?

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult SearchResults(PersonSearch search, int? page) 
{ 
    ViewData["Results"] = new PaginatedList<Person>(_searchService.FindPersons(search), page ?? 0, 1); 
    return View("SearchResults", search); 
} 

Sonra önceki/sonraki bağlantılar oluşturmak için vardır:

<%= Html.ActionLink("Next Page >", "SearchResults", routeValues) %> 

Ben nesne özellikleri adresini geçti görebilirsiniz, ama ben "sayfa" parametresini ekleyemezsiniz routeValues = ViewData.Model kullanırsanız . O kullanmak yerine (ve potansiyel akım routevalues ​​değiştirerek) arasında, doğru değerlerle başka nesne oluşturmak için daha iyi olacağını düşünüyorum

cevap

24

:

<%=Html.ActionLink("Next Page >", "SearchResults", new { 
    search = this.Model, 
    page = 1 //or whatever 
}) %> 
+0

gibi görünmelidir alıyorum:? Searchresults arama = RegistryManager.Models.PersonSearch & page = 1 – gremo

+4

... o sınıfın adını geçirir Çalışmaz değil, anahtar/çiftleri karşılık gelen değerleri nesne özellikleri ... – gremo

3

Sen ToString geçersiz kılmak gerekir().

2

Eğer Razor kullanıyorsanız (Jilet'in icat edilmesinden dört yıl önce OP'nin istediğini fark ettim, ama bunu kullanan kişiler belki de bunu kullanarak).

Inline @helper yöntemini kullanarak çalışan bir şey elde edebildim.

@helper RunnerLink(PersonSearch model, int page) 
{ 
    var routeParms =new RouteValueDictionary(model.GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(model, null))); 
    routeParms.Add("page", page.ToString()); 
    routeParms.Add("Controller", "Property"); 
    @Html.ActionLink("Search", "Index", routeParms) 
} 

Kullanımı basit olurdu -

@RunnerLink(myPersonSearchInstance, 1) 

En zarif bir çözüm değildir, ancak bir routeValue olarak bir nesneyi geçmek istiyorsan iyi çalışıyor, ancak geçmek gerekir Controller, Area veya OP'ler durumunda page gibi ek öğeler.

1

ActionLink yerine RouteLink kullanmanız gerekir. Kodunuz bu

@Html.RouteLink("Next", new {controller = "SearchResults", action = "Index", search=samevalue, page=1 }) 
İlgili konular