Server.TransferRequest
MVC 에서는 완전히 불필요 합니다. 이것은 요청이 페이지로 직접 전달되고 요청을 다른 페이지로 전송하는 방법이 필요했기 때문에 ASP.NET에서만 필요했던 구식 기능입니다. 최신 버전의 ASP.NET (MVC 포함)에는 원하는 리소스로 직접 라우팅하도록 사용자 지정할 수있는 라우팅 인프라가 있습니다 . 요청을 컨트롤러에 직접 전달하고 원하는 작업을 수행하기 만하면 다른 컨트롤러로 전송하기 위해 요청이 컨트롤러에 도달하도록 할 필요가 없습니다.
더 많은 것은 원래 요청에 응답하기 때문에 아무것도 넣을 필요가 없다는 것입니다.TempData
때문에 요청을 올바른 위치로 라우팅하기 위해 다른 저장소 나 다른 저장소에 . 대신 원래 요청이 그대로 유지 된 상태로 컨트롤러 작업에 도달합니다. 이 접근 방식은 전적으로 서버 측에서 이루어 지므로 Google에서 승인 할 것입니다.
IRouteConstraint
및 둘 다에서 상당한 작업을 수행 할 수 있지만 IRouteHandler
라우팅을위한 가장 강력한 확장 포인트는 RouteBase
서브 클래스입니다. 이 클래스는 들어오는 경로와 나가는 URL 생성을 모두 제공하도록 확장 될 수 있으므로 URL과 관련된 모든 작업과 URL이 실행하는 작업을 원 스톱으로 처리 할 수 있습니다.
그래서에서 얻을, 두 번째 예를 따르도록 /
에 /home/7
당신은 단순히 적절한 경로 값을 추가하는 경로가 필요합니다.
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Routes directy to `/home/7`
routes.MapRoute(
name: "Home7",
url: "",
defaults: new { controller = "Home", action = "Index", version = 7 }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
그러나 임의의 페이지가있는 원래 예제로 돌아 가면 경로 매개 변수가 런타임에 변경 될 수 없기 때문에 더 복잡합니다. 따라서 RouteBase
다음과 같이 하위 클래스로 수행 할 수 있습니다 .
public class RandomHomePageRoute : RouteBase
{
private Random random = new Random();
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RouteData result = null;
// Only handle the home page route
if (httpContext.Request.Path == "/")
{
result = new RouteData(this, new MvcRouteHandler());
result.Values["controller"] = "Home";
result.Values["action"] = "Index";
result.Values["version"] = random.Next(10) + 1; // Picks a random number from 1 to 10
}
// If this isn't the home page route, this should return null
// which instructs routing to try the next route in the route table.
return result;
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
var controller = Convert.ToString(values["controller"]);
var action = Convert.ToString(values["action"]);
if (controller.Equals("Home", StringComparison.OrdinalIgnoreCase) &&
action.Equals("Index", StringComparison.OrdinalIgnoreCase))
{
// Route to the Home page URL
return new VirtualPathData(this, "");
}
return null;
}
}
다음과 같이 라우팅에 등록 할 수 있습니다.
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Routes to /home/{version} where version is randomly from 1-10
routes.Add(new RandomHomePageRoute());
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
위의 예에서 사용자가 방문한 홈 페이지 버전을 기록하는 쿠키도 저장하여 사용자가 돌아 왔을 때 동일한 홈 페이지 버전을 수신하도록하는 것이 좋습니다.
또한이 접근 방식을 사용하면 쿼리 문자열 매개 변수를 고려하여 (기본적으로 완전히 무시 됨) 라우팅을 사용자 정의하고 그에 따라 적절한 컨트롤러 작업으로 라우팅 할 수 있습니다.
추가 예
ServerTransferAction
복제하려는 것이 정확히 무엇입니까 ? 그게 실제인가요? (... 그것에 질문에 대한 감사를 모든 정보를 찾을 수 없습니다, BTW, 대답은 아래 절경입니다)