2009-11-25 13 views

cevap

12

You should düzeltmek gerekir isteğe bağlı çapa parçasını izin iyi yollar ama RedirectToRouteResult basit kalıtım ve ExecuteResult geçersiz kılma olabilir rotalarınızı rota tablosunda düzgün şekilde oluşturun. Örn .:

routes.MapRoute("MyRoute" ,"{controler}/{id}#{detail}" ,new { controller = "users", action = "index", id = (string)null, detail = "Summary" }); 
0

Sitemde böyle bir şey yapıyorum here. Ancak RedirectToRouteResult ile değil. RedirectToRouteResult, URL'ye bir çapa parçası dahil etmeyi desteklemez.

Bağlantıyı kendiniz ve hatta bağlantı parçasının işlenmesiyle ilgili mantığı oluşturmalısınız - benim yaptığım gibi. Uygulamam Facebook fotoğraf galerisi görünümlerine benzer işlevleri çoğaltmaya çalışır. Farklı bir sayfaya giden her bağlantının benzersiz bir URL'si olmalıdır. Bu nedenle, çapa bölümünü kullanıyorum. Ancak coz doğrudan bir rotaya çevirmiyor, URL'nin çapa kısmını sayfa üzerinde elle ayrıştırmam gerekiyor ve uygun içeriğe yüklemek için ajax kullanıyorum. İstediğim şey bu yüzden benim için çalışıyor.

+1

Bu sadece; Kendimi bir URL oluşturabileceğimi biliyorum, ancak örneğin test ederken, birim testlerimde güçlü bir şekilde yazılan kontrollerden yararlanmak istiyorum. –

+1

görüyorum. iyi şansın olduğunu düşünüyorum o zaman –

5

UrlHelper.GenerateUrl bir parça parametresi içerir. Ben ne sen, alacağınız şekilde kontrol etmek için birim testinde bir RedirectToFragmentResult sınıfı

public class RedirectToFragmentResult: RedirectResult 
{ 
    public UrlHelper Url {get;set;} 
    public string Action { get; set; } 
    public string Controller { get; set; } 
    public string Fragment { get; set; } 
    public object RouteValues { get; set; } 
    public RedirectToFragmentResult(UrlHelper url, string action, string controller, string fragment, object routeValues) 
     :base(url.Action(action, controller, fragment, routeValues)) 
    { 
     Url = url; 
     Action = action; 
     Controller = controller; 
     Fragment = fragment; 
     RouteValues = routeValues; 
    } 
} 

Sonra sadece yeni RouteValueDictionary (result.RouteValues) oluşturabilir oluşturulan

 public static string Action(this UrlHelper url, string actionName, string controllerName, string fragment, object routeValues) 
     { 
      return UrlHelper.GenerateUrl(
       routeName: null, 
       actionName: actionName, 
       controllerName: controllerName, 
       routeValues: new System.Web.Routing.RouteValueDictionary(routeValues), 
       fragment: fragment, 
       protocol: null, 
       hostName: null, 
       routeCollection: url.RouteCollection, 
       requestContext: url.RequestContext, 
       includeImplicitMvcValues: true /*helps fill in the nulls above*/ 
      ); 
     } 

Sonra bir uzantısı yöntemi yarattı bir RedirectToRouteResult.

+0

Teşekkürler @Joel Bu çok iyi çalışıyor gibi görünüyor. Yerel URL özelliği olmasına gerek yok ('gizler' uyarısı atar). Kaldırılan satırlarla test ettim: "public UrlHelper Url {get; set;} 've' Url = url; '- bunun neden herhangi bir nedeni var? – Chris

+1

Hata ayıklama için bunu kullanıyorum, bu yüzden izleme penceresinden urlhelper'a erişebilirim, ancak bu tabanı düzeltirsiniz (url.Action, kullanılan son gerçek zaman ve test için gereksizdir) –

İlgili konular