2015-05-12 12 views
6

içermemesi gereken parametreyle değiştiriliyor Sunucuda bir görünümü önbelleğe almak için MVC 5'te OutputCache kullanıyorum.OutputCache VaryByParam,

Sadece bir sorgu dizesinde iki parametresi temel alan bir görünümü önbelleğe almak istiyorum.

Eylem Metodu

[HttpGet] 
[OutputCache(Location = OutputCacheLocation.Server, Duration = 60*10, VaryByParam = "id;quoteid")] 
public ActionResult MyAction(int id, ProductCategoryType category) 
{ 
    return Content(DateTime.Now.ToString()); 
} 

Rota

context.MapRoute(
"MyCustomRoute", 
"myarea/{controller}/{action}/{id}/{category}/{name}/{quoteId}", 
new { controller = "MyController", name = UrlParameter.Optional, quoteId = UrlParameter.Optional }, 
new[] { "MyNamespace.Areas.MyArea.Controllers" }); 

Bu çalışır ve

http://localhost:17191/myarea/mycontroller/myaction/2/1/a-holiday/aquoteid 

URLBen URL {name} kısmının herhangi bir bölümünü değiştirmek, yine benim eylem yönteminde ben Örneğin

VaryByParam="id;quoteid" yöntem, belirtilen olsanız bile, yeni bir önbellek öğesi oluşturur, doğru Ancak veri bağlar ...

http://localhost:17191/myarea/mycontroller/myaction/2/1/a-holiday/somequoteid 

ve

http://localhost:17191/myarea/mycontroller/myaction/2/1/another-holiday/somequoteid 

... farklı DateTime çıkışları ürettiğini - ama olmamalıdır - bunlar aynı olmalıdır.

Neyi yanlış yaptım ve istenen davranışı nasıl başarabilirim?


Daha açıkçası Düzenleme, ProductCategoryType o int değer üzerinden bağlanmış olan bir Enum olduğunu. Ben ProductCategoryType göstermek istendi beri ActionResult

düzenle 2 hata ayıklama bunun için bağlayıcı, aşağıdan ekledik doğrudur. Bu, hata ayıkladığımda doğru bir şekilde bağlanır - sorunla ilgili bir şey olduğunu düşünmüyorum.

public enum ProductCategoryType 
{ 
    TourActivity = 1, 
    Accommodation = 2, 
    BusPass = 3, 
    SelfDrive = 4, 
} 

Düzenleme 3

URL'yi değiştirme: http://localhost:17191/a/products/view/2/1?name=test1&quoteid=123

Ve beklendiği gibi önbellek artık çalışıyor - ama nasıl yönlendirme yoluyla daha güzel URL ile bunu başarabilirsiniz?

+0

Ürün Kategorisi modelinizi gösterebilir misiniz? – freshbm

+0

@freshbm Bu bir model değil - bir enum. Yine de soruya yine de ekleyeceğim. – Alex

+0

öyleyse buradaki eyleminizi nereye yerleştirirsiniz, VaryByParam – freshbm

cevap

2

VaryByParam kullanan mekanizma, gerçek işlenmemiş HTTP isteğinin sorgulama veya post parametrelerine özel olarak davranır ve işlenmemiş istekleri başka bir form üzerine eşleyen herhangi bir URL yordamının farkında değildir. Dolayısıyla, sizin durumunuzda, id veya quoteid parametrelerini hiç görmeyecektir (çünkü bunlar aslında ham isteklerin sorgulamada veya yayınında bulunmaz). Bununla birlikte, URL'nin kendisinin (adın da dahil olduğu herhangi bir '?' Önce) farklı olduğunu ve bunun üzerinde önbelleğe alındığını fark edecektir.

Bunun yerine VaryByCustom kullanmayı düşünmeniz gerekebilir. Örnek için here'a bakın. Ve çok benzer bir SO-soru örneği var here.

İlgili konular