ASP.NET MVC 3 면도기 ViewStart 파일에서 다른 레이아웃을 어떻게 지정합니까?


313

내 응용 프로그램에 2 개의 개별 레이아웃을 갖고 싶습니다. 하나는 웹 사이트의 공개 섹션을위한 것이고 다른 하나는 회원 측을위한 것이라고합시다.

간단하게하기 위해 각 사이트에 대한 모든 로직이 2 개의 개별 컨트롤러에 깔끔하게 래핑되어 있다고 말할 수 있습니다.

  • PublicController
  • StaffController

그리고 그들 각각은 각각 아래에있는 모든보기에 해당하는 레이아웃을 가지고 있습니다.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

_ViewStart.cshtml 파일을 사용하여 "Public"아래의 모든 View / Action이 PublicLayout을 사용하고 "Staff"아래의 모든 것이 StaffLayout을 사용하도록 지정하려면 어떻게해야합니까?

감사!


4
만일을 위해 : 특정 Razor뷰 의 레이아웃을 제거하려면 다음 과 같이 설정하십시오.Layout = null;
Leniel Maccaferri

3
예제에 대한 설명과 마찬가지로 Public 및 Staff라는 컨트롤러가 없어야합니다. 컨트롤러는 EventController, UserController 등과 같은 특정 주요 비즈니스 엔터티에서 CRUD와 같은 동작의 진입 점으로 가장 자주 구현됩니다. 응용 프로그램이 상당히 큰 경우 공용 / 직원 컨트롤러의 책임이 넓어집니다. 대신 영역을 고려하십시오. msdn.microsoft.com/ko-kr/library/ee671793%28VS.100%29.aspx 이 점을 알고 있지만이 내용을 읽는 사람은 잘못된 아이디어를 얻을 수 있습니다.
Alex

답변:


558

폴더 _ViewStart.cshtml안에 파일을 넣고 /Views/Public폴더의 기본 파일 을 무시 /Views하고 원하는 레이아웃을 지정할 수 있습니다.

@{
    Layout = "~/Views/Shared/_PublicLayout.cshtml";
}

유추 하여 다음과 _ViewStart.cshtml같이 /Views/Staff폴더 안에 다른 파일을 넣을 수 있습니다.

@{
    Layout = "~/Views/Shared/_StaffLayout.cshtml";
}

컨트롤러 작업 내에서 뷰를 반환 할 때 사용해야하는 레이아웃을 지정할 수도 있지만 이는 작업 별입니다.

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

또 다른 가능성은 레이아웃을 재정의하는 사용자 지정 동작 필터입니다. 당신이 이것을 달성 할 수있는 많은 가능성을 볼 수 있듯이. 시나리오에 가장 적합한 것을 선택하십시오.


최신 정보:

의견 섹션에서 요청한대로 마스터 페이지를 선택하는 작업 필터의 예는 다음과 같습니다.

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}

그런 다음 원하는 레이아웃을 지정 하여이 사용자 정의 속성으로 컨트롤러 또는 작업을 장식하십시오.

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}

1
@DarinDimitrov 어디에서 만들 것인가 LayoutInjecterAttribute. ? 특정 위치가 있습니까?
kbvishnu

2
@VeeKeyBee, ActionFilters하위 폴더 안에 넣을 수 있습니다 .
Darin Dimitrov

한 가지 잠재적 인 문제 LayoutInjecterAttribute: 컨트롤러의 메소드 전에 호출 OnException됩니다. 따라서 컨트롤러가 예외 처리 중에보기 결과를 제공하면 레이아웃이 설정되지 않습니다.
Jeff Sharp

MVC의 새로운 사람으로서,이 답변에서 저를 많이 가르쳐 주셔서 감사합니다. 그러나 나는 내부에서 일어나는 일을 이해하지 못합니다 OnActionExecuted. 답변을 업데이트 해 주시겠습니까?
Imad

29

또 다른 방법은 뷰 내에서 레이아웃을 정의하는 것입니다.

   @{
    Layout = "~/Views/Shared/_MyAdminLayout.cshtml";
    }

더 많은 방법, 여기 에서 찾을 수 있습니다 , 이것이 누군가를 돕기를 바랍니다.


1
별도의 _ViewStart.cshtml이 없으면 뷰가 다른 레이아웃의 @RenderBody () 메서드 내에서 렌더링됩니다.
Tillman32

이! 왜 당신이해야 할 때 모두가이 매우 복잡한 과정을 진행하고 있습니까?
George Harnwell

15

이 방법은 초보자가 ASP.NET MVC 응용 프로그램에서 레이아웃 렌더링을 제어 할 수있는 가장 간단한 방법입니다. 컨트롤러를 식별하고 레이아웃을 par 컨트롤러로 렌더링 할 수 있습니다.이를 위해 Views 폴더의 루트 디렉토리에있는 _ViewStart 파일에 코드를 작성할 수 있습니다. 다음은 수행 방법을 보여주는 예입니다.

@{
    var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
    string cLayout = "";

    if (controller == "Webmaster")
        cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
    else
        cLayout = "~/Views/Shared/_Layout.cshtml";

    Layout = cLayout;
}

전체 기사 읽기 여기에 "어떻게 ASP.NET MVC에서 다른 레이아웃을 렌더링하기 위해"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.