2013-12-09 5 views
41

시나리오 : ASP.NET MVC 5 사이트에 Forms 영역이 있습니다.속성 라우팅이 영역에서 작동하지 않습니다.

새로운 속성 라우팅 기능을 사용하여 정의한 맞춤 경로를 사용하는 세부 정보 작업으로 리디렉션하려고합니다.

RedirectToAction :

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

내가로 리디렉션 해요 조치 :

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

    ... 

    return View(model); 
} 

내가 http://localhost/forms/my-slug에 리디렉션을 기대하는 대신 앱을 http://localhost/Forms/Details?slug=my-slug에 나를 리디렉션됩니다.

이것은 속성 라우팅이 작동하지 않는다는 것을 의미합니다.

어떻게 해결할 수 있습니까?

routes.MapMvcAttributeRoutes()를 추가했습니다. 내 RouteConfig에 라인 :

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 } 
     ); 
    } 
} 

그리고 여기 내 위해 Application_Start()이다 : 당신은 아마 속성 라우팅 규칙 기반 라우팅을 결합하는

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

답변

77

, 당신은 속성 경로를지도 한 후에는 있는 분야를 등록해야.

라인

AreaRegistration.RegisterAllAreas(); 

이 줄 끝에서 호출해야합니다 :

routes.MapMvcAttributeRoutes(); 

설명 (http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx#route-areas에서) :

당신이 경로 속성을 가진 두 영역을 사용하는 경우, (AreaRegistration 클래스에 의해 설정된) 규칙 기반 노선이있는 지역의 경우, 지역 등록 기관 MVC 속성 라우트가 구성된 후에 기본 컨벤션 기반 라우트가 설정되기 전에 발생합니다. 그 이유는 들어오는 요청을 너무 일찍 조화시킴으로써 더 구체적인 경로를 "숨기는"일반적인 경로가 발생하지 않도록 경로 등록을 가장 일반적인 (속성)에서 더 일반적인 (영역 등록)을 거쳐 안개 일반 (기본 경로)으로 정렬해야하기 때문입니다 파이프 라인. 당신이 빈 asp.net MVC 웹 사이트를 만들 때 Visual Studio에서 "영역 추가"조치가 RegisterAllAreas이 위해 Application_Start에 전화를 추가하기 때문에

, 전에,이 문제가 발생합니다 영역을 추가하고 속성 라우팅을 사용하기 시작 경로 구성 ..

대체 솔루션

은 아마 당신은 라우팅 속성 규칙 기반 라우팅을 계속 사용 만 사용하는 것을 선호하지 않으려는. 이 경우 FormsAreaRegistration.cs 파일을 삭제하면됩니다.

+1

박쥐! MVC 5.1에서이 어리석은 변화를 알아 내려고 거의 4 시간을 소비 한 후에는 내 문제를 한 번에 해결할 수 있습니다. – Korayem

+0

시간이 지남에 제 질문 + 답변이 많은 사람들을 도왔습니다. –

+2

이것은 나를 위해 일했습니다 .. 단순히 작동하지 않을 것이므로 지역 경로 속성을 버렸습니다. 그러나 routes.MapMvcAttributeRoutes() 다음에 AreaRegistration.RegisterAllAreas()를 이동 한 후에 마술처럼 트릭을 수행했습니다! –

34

AreaRegistration.RegisterAllAreas()를 RouteConfig.cs로 옮기는 것만으로는 충분하지 않았습니다.나는 또한 RouteArea의 attibute의 AreaPrefix 매개 변수를 사용하는 데 필요한 :

//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(); 
    } 
} 

편집

: 어떤 점에서, 나는 잘 라우팅 속성 처리하는 방법을 보여 주었다 Microsoft에서 샘플 솔루션을 가로 질러왔다. 또한 SelectListinput[type="radio"] 항목으로 변환하는 방법과 input[type="checkbox"] 항목을 같은 방식으로 변환하는 방법에 대한 좋은 예가 나와 있습니다 (상기 한 경우). 이 샘플 솔루션은 아마도이 질문에 대한 더 나은 대답 일뿐 아니라 라디오 버튼과 체크 박스 항목 표시에 대한 좋은 예제를 제공합니다. 누구든지이 샘플 솔루션을 알고 있다면 링크가 포함 된 설명을 추가하십시오.

+0

이 기능이 없으면 뷰 엔진이 내 뷰의 위치를 ​​올바르게 추측 할 수있었습니다. –

+3

AreaPrefix = ""인 경우에도 AreaPrefix가 필요했습니다 (.NET 4.6.1 응용 프로그램, 이름이 같은 다른 영역/폴더가 없어 모호성이 없음) – jspinella

관련 문제