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.