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

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

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

  • PublicController
  • StaffController

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

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

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

감사!



답변

폴더 _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();
}


답변

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

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

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


답변

이 방법은 초보자가 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에서 다른 레이아웃을 렌더링하기 위해”


답변