asp.net-mvc - asp.net mvc iis 설정




MVC에서 기본 경로(영역에) 설정하는 방법 (9)

Aaron이 의견을 찾는 것에 대해 지적했기 때문에 Aleon은 오해했습니다.

[업데이트] 방금 코드 나 조회 경로를 사용하지 않고 기본값으로 사용자에게 영역을 보내는 프로젝트를 만들었습니다.

global.asax에서 평소와 같이 등록하십시오.

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

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = ""}  // Parameter defaults,
        );
    }

Application_Start() 에서 다음 순서를 사용하십시오.

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);
    }

지역 등록에서

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "ShopArea_default",
            "{controller}/{action}/{id}",
            new { action = "Index", id = "", controller = "MyRoute" },
            new { controller = "MyRoute" }
        );
    }

예제는 http://www.emphess.net/2010/01/31/areas-routes-and-defaults-in-mvc-2-rc/ 에서 찾을 수 있습니다 http://www.emphess.net/2010/01/31/areas-routes-and-defaults-in-mvc-2-rc/

나는 이것이 당신이 요구 한 것이기를 정말로 바랍니다 ...

////

나는 가상의 ViewEngine 을 쓰는 ViewEngine 경우에는 최선의 해결책이라고 생각하지 않는다. (명성이 부족하다, 나는 말할 수 없다). WebFormsViewEngine 은 영역을 인식하며 기본적으로 정의 된 AreaViewLocationFormats 를 포함합니다.

AreaViewLocationFormats = new[] {
        "~/Areas/{2}/Views/{1}/{0}.aspx",
        "~/Areas/{2}/Views/{1}/{0}.ascx",
        "~/Areas/{2}/Views/Shared/{0}.aspx",
        "~/Areas/{2}/Views/Shared/{0}.ascx",
    };

나는 당신이이 대회를 준수하지 않는다고 믿습니다. 게시했습니다.

public ActionResult ActionY() 
{ 
    return View("~/Areas/AreaZ/views/ActionY.aspx"); 
} 

작동 해킹으로,하지만 그해야합니다

   return View("~/Areas/AreaZ/views/ControllerX/ActionY.aspx"); 

그러나 컨벤션을 따르고 싶지 않은 경우에는 생성자에서 조회 경로를 설정할 수있는 WebFormViewEngine (예 : MvcContrib에서 수행)에서 파생하거나, Application_Start 이와 같은 컨벤션을 지정하면 조금 해킹 될 수 있습니다.

((VirtualPathProviderViewEngine)ViewEngines.Engines[0]).AreaViewLocationFormats = ...;

이것은 조금 더주의를 기울여 수행해야합니다. 그러나 생각을 보여줄 것 같습니다. 이 필드는 MVC 2 RC의 VirtualPathProviderViewEngine 에서 public 입니다.

좋아, 이전에 물어 보았지만 거기에는 확실한 해결책이 없다. 그래서 나 자신과 다른 사람들이 이것을 유용하게 쓸 수있는 목적을 위해.

MVC2 (ASP.NET)에서 누군가가 웹 사이트를 탐색 할 때 기본 영역이 지정되기를 원합니다. 따라서 내 사이트로 이동하면 AreaZ의 ControllerX ActionY로 이동하게됩니다.

Global.asax에서 다음 경로 사용

routes.MapRoute(
                "Area",
                "",
                new { area = "AreaZ", controller = "ControllerX ", action = "ActionY " }
            );

이제는 올바른 페이지를 제공하려고 시도하는 것처럼 작동합니다. 그러나 MVC는 영역 폴더가 아니라 사이트의 루트에서보기를 찾습니다.

이 문제를 해결할 방법이 있습니까?

편집하다

'Solution'이 있으며 ControllerX에 있으며, ActionY는 뷰의 전체 경로를 반환합니다. 해킹 비트이지만 작동합니다. 그러나 나는 더 나은 해결책이 있기를 바라고 있습니다.

         public ActionResult ActionY()
        {
            return View("~/Areas/AreaZ/views/ActionY.aspx");
        }

편집하다:

이것은 또한 페이지의 HTML ActionLink가있을 때 문제가됩니다. 영역이 설정되어 있지 않으면 작업 링크가 공백으로 출력됩니다.

이 모든 것이 설계 상 또는 결함인가?


RC에이 설정이 있는지 확실하지 않더라도 다음을 Application_Start에 추가하면 나에게 적합합니다.

var engine = (WebFormViewEngine)ViewEngines.Engines.First();

// These additions allow me to route default requests for "/" to the home area
engine.ViewLocationFormats = new string[] { 
    "~/Views/{1}/{0}.aspx",
    "~/Views/{1}/{0}.ascx",
    "~/Areas/{1}/Views/{1}/{0}.aspx", // new
    "~/Areas/{1}/Views/{1}/{0}.ascx", // new
    "~/Areas/{1}/Views/{0}.aspx", // new
    "~/Areas/{1}/Views/{0}.ascx", // new
    "~/Views/{1}/{0}.ascx",
    "~/Views/Shared/{0}.aspx",
    "~/Views/Shared/{0}.ascx"
};

글쎄, 사용자 정의보기 엔진을 만들 때이 작업을 수행 할 수 있지만 여전히 대안을 가질 수 있습니다.

  • 기본적으로 표시 할 내용을 결정하십시오.
  • 그 무언가는 컨트롤러와 액션 (그리고 Area)을 가지고 있습니다, 맞습니까?
  • 해당 Area 등록을 열고 다음과 같이 추가하십시오 :
public override void RegisterArea(AreaRegistrationContext context)
{
    //this makes it work for the empty url (just domain) to act as current Area.
    context.MapRoute(
        "Area_empty",
        "",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new string[] { "Area controller namespace" }
    );
        //other routes of the area
}

건배!


나는 그가 ~/ URL을 방문한 번 ~/AreaZ URL로 리디렉션되기를 원한다고 생각합니다. 루트 HomeController 내에서 다음 코드를 사용하여 구현할 수 있습니다.

public class HomeController
{
    public ActionResult Index()
    {
        return RedirectToAction("ActionY", "ControllerX", new { Area = "AreaZ" });
    }
}

그리고 Global.asax 의 다음 경로.

routes.MapRoute(
    "Redirection to AreaZ",
    String.Empty,
    new { controller = "Home ", action = "Index" }
);

먼저 MVC2의 어떤 버전을 사용하고 있습니까? preview2에서 RC 로의 중요한 변경 사항이 있습니다.

RC를 사용한다고 가정하면 경로 매핑이 다르게 보일 것입니다. 해당 지역의 AreaRegistration.cs 에서 기본 경로를 등록 할 수 있습니다. 예 :

        context.MapRoute(
            "ShopArea_default",
            "{controller}/{action}/{id}",
            new { action = "Index", id = "", controller="MyRoute" }
        );

위 코드는 사용자를 MyRouteControllerShopArea 로 기본값으로 ShopArea .

컨트롤러를 지정해야하므로 빈 문자열을 두 번째 매개 변수로 사용하면 예외가 발생합니다.

물론 Global.asax 에서 기본 경로를 변경해야합니다 (예 : 기본 사이트의 접두어 사용).

또한이 스레드와 Haack의 답변을 참조하십시오 : MVC 2 AreaRegistration Routes Order

희망이 도움이됩니다.


음,이 모든 프로그래밍이 왜 그런지 모르겠다. 원래의 문제는이 기본 경로를 지정함으로써 쉽게 해결된다고 생각한다.

routes.MapRoute("Default", "{*id}", 
                 new { controller = "Home"
                     , action = "Index"
                     , id = UrlParameter.Optional 
                     }
              );

이 작업을 수행하기 위해 수행 한 작업은 다음과 같습니다.

  1. root / Controllers 폴더에 기본 컨트롤러를 만들었습니다. 내 컨트롤러 DefaultController라는.
  2. 컨트롤러에서 다음 코드를 추가했습니다.

    namespace MyNameSpace.Controllers {
    public class DefaultController : Controller {
        // GET: Default
        public ActionResult Index() {
            return RedirectToAction("Index", "ControllerName", new {area = "FolderName"});
        }
    } }
  3. 내 RouterConfig.cs에서 다음을 추가했습니다 :

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

이 모든 것의 배후의 트릭은 내 앱이 시작될 때마다 언제나 시작 컨트롤러가 될 기본 생성자를 만들었다는 것입니다. 기본 컨트롤러에 도달하면 기본 인덱스 동작에서 지정한 모든 컨트롤러로 리디렉션됩니다. 내 경우에는

www.myurl.com/FolderName/ControllerName

.


이 질문에 대한 받아 들여진 해결책은 사용자 정의보기 엔진을 작성하는 방법을 요약하는 동안 올바른 질문에 대답하지 않는 것입니다. 여기서 문제는 피노가 자신의 기본 경로를 잘못 지정하고 있다는 것입니다. 특히 그의 "영역"정의가 올바르지 않습니다. "Area"는 DataTokens 컬렉션을 통해 확인되며 다음과 같이 추가되어야합니다.

var defaultRoute = new Route("",new RouteValueDictionary(){{"controller","Default"},{"action","Index"}},null/*constraints*/,new RouteValueDictionary(){{"area","Admin"}},new MvcRouteHandler());
defaultRoute.DataTokens.Add("Namespaces","MyProject.Web.Admin.Controller"); 
routes.Add(defaultRoute);

defaults 객체에 지정된 "영역"은 무시 됩니다. 위의 코드는 사이트의 루트에 대한 요청을 포착 한 다음 기본 영역 인 관리 영역의 색인 동작을 호출하는 기본 경로를 만듭니다. DataTokens에 "네임 스페이스"키가 추가된다는 점에 유의하십시오. 동일한 이름을 가진 컨트롤러가 여러 개있는 경우에만 필요합니다. 이 솔루션은 Mvc2 및 Mvc3 .NET 3.5 / 4.0에서 검증되었습니다.


routes.MapRoute(
                "Area",
                "{area}/",
                new { area = "AreaZ", controller = "ControlerX ", action = "ActionY " }
            );

너 그거 해봤 니?





asp.net-mvc-2