2013-12-09 25 views
41

Senaryo: ASP.NET MVC 5 sitemde bir Form alanım var.Öznitelik Yönlendirme Bölgelerde çalışmayan

Yeni Öznitelik Yönlendirme özelliği kullanılarak tanımlanan özel bir rota kullanan Ayrıntılar Eylemine yeniden yönlendirmeyi deniyorum.

RedirectToAction:

return RedirectToAction("Details", new { slug }); 

ben yönlendirmekten ediyorum eylemi:

[HttpGet] 
[Route("forms/{slug}")] 
public ActionResult Details(string slug) 
{ 
    var form = FormRepository.Get(slug); 

    ... 

    return View(model); 
} 

Ben http://localhost/forms/my-slug için bir yönlendirme beklenir ancak bunun yerine app http://localhost/Forms/Details?slug=my-slug beni yönlendirilmesidir.

Bu, özellik yönlendirmesinin çalışmadığı anlamına gelir.

Bu nasıl çözülebilir?

Rotaları ekledim.MapMvcAttributeRoutes(); Benim RouteConfig satır:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapMvcAttributeRoutes(); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

Ve işte benim Application_Start() var: Muhtemelen özelliği, güzergah ile kongre tabanlı yönlendirme birleştiriyorlar

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

cevap

77

ve nitelik yolları haritasına sonra alanlarınızı kayıt olmalıdır.

hat

AreaRegistration.RegisterAllAreas(); 

bu hat SONRA çağrılmalıdır:

routes.MapMvcAttributeRoutes(); 

açıklama (http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx#route-areas itibaren):

rota özellikleriyle hem Alanları kullanıyorsanız, ve konvansiyonel rotaları olan alanlar (bir AreaRegistration sınıfı tarafından belirlenir), o zaman alan kayıtlarının olduğundan emin olmanız gerekir. MVC öznitelik yolları yapılandırıldıktan sonra, ancak varsayılan kural tabanlı rota ayarlanmadan önce iyon oluşur. Bunun nedeni, rota kaydının, gelen talepleri çok erken doldurarak daha spesifik rotalardan “saklanması” gibi genel yollardan kaçınmak için daha genel (alan tescili) sis jenerikine (varsayılan rota) kadar en spesifik (öznitelikler) sipariş edilmesidir. boru hattı. Boş asp.net mvc web sitesi oluşturmak zaman görsel stüdyoda "Alan Ekle" eylem RegisterAllAreas sizin Application_Start aramak ekler çünkü

, önce, bu sorunu karşılaşacak bir alan ekleyip nitelik yönlendirmesini kullanarak başlamak rota yapılandırma ..

Alternatif çözüm

Belki yönlendirme özelliğini kongre tabanlı yönlendirme kullanmaya devam ve tek kullanım tercih etmek niyetinde değiliz. Bu durumda FormsAreaRegistration.cs dosyasını silebilirsiniz.

+1

TATLI! MVC 5.1'deki bu aptal değişimi anlamaya çalışırken yaklaşık 4 saat geçirdikten sonra, çözümünüz bir kez ve her şey için problemimi çözer. – Korayem

+0

Benim soru + cevap zaman içinde çok fazla insan yardımcı oldu :-) mutluyum –

+2

Bu benim için çalıştı .. Ben sadece çalışmaz çünkü alan rota öznitelikleri terk vardı. Ancak, route.MapMvcAttributeRoutes() sonra AreaRegistration.RegisterAllAreas() taşıdıktan sonra, sihirle hile yaptı! –

34

AreaRegistration.RegisterAllAreas() yolunu RouteConfig.cs için taşıma benim için yeterli değildi.Ayrıca RouteArea attibute için AreaPrefix parametresini kullanmak gerekli:

//Use the named parameter "AreaPrefix" 
[RouteArea("AreaName", AreaPrefix = "area-name-in-url")] 
[RoutePrefix("controller-name-in-url")] 
public class SampleController : Controller 
{ 
    [Route("{actionParameter}")] 
    public ActionResult Index(string actionParameter) 
    { 
     return View(); 
    } 
} 

Düzenleme

: Bir noktada, ben güzel yönlendirme özelliğini nasıl başa gösterdi Microsoft'tan örnek bir çözüm üzerinde geldi. Ayrıca bir SelectList'un input[type="radio"] öğelerinin bir dizisine nasıl dönüştürüleceğine dair güzel örneklerin yanı sıra input[type="checkbox"] öğesinin bir dizisiyle (hatırlamıyorsam) da aynı şeyi gösterdi. Bu örnek çözüm muhtemelen bu soruya daha iyi cevap vermesidir - bunun yanı sıra, radyo düğmeleri ve onay kutusu öğelerinin görüntülenmesiyle ilgili iyi örnekler vermenin yanı sıra. Bu örnek çözümden haberdar olan biri varsa lütfen bağlantıya sahip bir yorum ekleyin.

+0

Bu olmadan, görünüm motoru, görünümümün konumunu doğru bir şekilde bulmayı başardı. –

+3

Sadece AreaPrefix = "" (.NET 4.6.1 uygulaması, aynı ada sahip başka bir alan/klasör yok) – jspinella