2015-02-06 4 views
1

MVC 라우팅과 관련하여 여기에 많은 Q & A가 있습니다. 불행히도, 나는 아직도 내가 이해하지 못하는 라우팅에 관한 몇 가지 문제를 가지고있다.ASP.NET MVC 5에 대한 이해

맨 먼저 및 맨 먼저 - 내 컨트롤러에서 ActionResults를로드 할 수 있습니까?

예를 들어, 서로 다른 매개 변수를 사용하여 동일한 컨트롤러/동작에 대해 3 회의 요청을합니다.

  • "/ MyController에/해봐요"
  • "/ MyController에/해봐요/[Guid를 문자열]
  • "/ MyController에/해봐요/[Guid를 문자열]/TYPEA

... 및 컨트롤러에서 나는이 방법을 가지고있다.

나는 각각의 오버로드 된 메소드가 그것을 할 것이라고 기대한다. 유일한 ActionMethod는 입력 한 매개 변수와 상관없이 DoSomething()입니다. 즉, DoSomething (String id) 및 DoSomething (String id, String type)은 완전히 무시됩니다.

public ActionResult DoSomething(String? id) 
{ 
    ViewBag.Title = "Do Something Conditionally"; 
    return View(); 
} 

나는이 시도조차

... 그냥 ... 무슨 일이 일어날 지 볼. 컴파일 오류가

오류 4 유형 '문자열' '선택 System.Nullable'

제네릭 형식 또는 메서드 에 매개 변수로 'T'를 사용하기 위해 에 nullable이 아닌 값 형식이어야합니다 발생합니다

참고 : 매개 변수는 문자열 (기술적으로 GUID)입니다. 정수가 아닙니다.

은 내가

routes.MapRoute(
    "MyController", 
    "MyController/DoSomething/{id}", 
    new { controller = "MyController", action = "DoSomething", id = "" } 
); 

작업 한 오버로드 된 메서드를 얻을 수 ... 여전히 해봐요 수 있다면 단지 (보고 나는/App_Start/RouteConfig 클래스의 노선을지도하는 데 필요한 아마 생각이 시도 String id) ActionResult가 호출되지 않았습니다. 오류도 예외도 없습니다. MapRoute를 지정하지 않은 경우에도 마찬가지입니다.

여기에 누락 된 것이 있습니까? 당신이 제공 할 수있는 통찰, 지시,지도는 크게 감사 할 것입니다.

+1

라우팅이 작동하지 않습니다. 원하는 것을 얻을 수 있지만 좀 더 복잡하고 라우팅 제약 조건 및 기타 요인을 사용해야합니다. 지금은 설명 할 시간이 없지만 다른 사람들은 잘 할 수있을 것입니다. MVC는 특정 메소드에 대해 HTTP 동사 (get, post 등 ..) 당 하나의 동작 메소드 만 허용합니다. 따라서 Index() 및 Index (string x)를 가질 수 있지만 서로 다른 동사 여야합니다. 이것은 모델 바인딩 메커니즘의 제한 사항입니다. MVC는 HTTP 형식 필드 또는 쿼리 문자열과 연결된 형식이 없으므로 선택할 오버로드를 알지 못합니다. –

+0

글쎄 - 나는 그것이 정착한다고 생각한다. 감사합니다 Erik - 통찰력에 감사드립니다. 이 문제를 해결할 수 있는지 라우팅 제약을 살펴 보겠습니다. –

+0

좋아요. 음, 확실하게 도움이 될 일의 특정 측면을 얻을 수있었습니다. DoSomething (String id)와 같은 DoSomething() ActionResult 메서드가없는 ActionResult가있는 것으로 나타났습니다. 매개 변수를 조건부로 사용하거나 사용하지 않고이 메서드를 사용할 수 있습니다. 문자열로만 테스트했지만 작동합니다. 삽입 및 미리 채워진 양식의 새 양식에 대해 동일한 조치 및보기를 사용하면 충분합니다. –

답변

0

이 작업을 효과적으로 수행하려면 작업중인 매개 변수를 식별하고 매개 변수가 null 인 경우 기본값을 적용해야합니다. 궁극적으로 이는 단일 조치로 이어질 것입니다. 상기 예의 경우 경우 - 해봐요() 및 해봐요 (문자열 ID)를 제거하고 해봐요의 범위 내에서만 작동 (문자열 ID, 문자열 유형)

public ActionResult DoSomething(String id, String type) 
{ 
    var _id = String.Empty 
    var _type = String.Empty 

    if(id != null) 
    { 
     _id = id 
    } 

    if(type != null) 
    { 
     _type = type 
    } 

    ViewBag.Title = "Do Something By id and type conditionally"; 
    return View(); 
} 

다음하면 요청이 이루어진 경우, 그들은 모두 단일 조치 내에서 논리적 조건에 따라 작동합니다.

  • "/ MyController에/해봐요"
  • "/ MyController에/해봐요/[Guid를 문자열]
  • "/ MyController에/해봐요/[Guid를 문자열]/TYPEA
+0

네, 이것을 처리하는 좋은 방법입니다. 매개 변수가 지정되지 않은 경우 유형이 null이됩니다 (경로에서 매개 변수를 선택적으로 가정). ID가없는 경우 유형을 가질 수 없지만 요구 사항인지 확실하지 않습니다. –

-1
  • 라우팅 인 실행할 컨트롤러 클래스의 동작 메서드를 결정하는 MVC의 메커니즘입니다. 라우팅 없이는 액션 메소드를 매핑 할 수 없습니다. 요청에. - 라우팅은 MVC 아키텍처의 일부이므로 ASP입니다. MVC는 기본적으로 라우팅을 지원합니다.
  • 라우팅은 들어오는 URL을 검사하고 요청과 매핑 된 컨트롤러 및 작업을 찾습니다. 컨트롤러 동작에 해당하는 나가는 URL을 생성합니다.
  • 사용자 친화적 인 URL을 만드는 데 사용됩니다.
  • asp.net 웹 양식과 마찬가지로 응용 프로그램의 시작 페이지를 설정하는 데 사용할 수도 있습니다.
+0

질문 * 제목 *에 아주 좋은 답변입니다. -1. –

관련 문제