레이아웃이없는 Razor보기


81

Layout = null;내 뷰에 있을 때 어떻게 -여전히 기본 레이아웃을 가져옵니다?!

그것을 막을 수있는 트릭이 있습니까?

레이아웃이없는 내보기는 다음과 같습니다.

@{
    Layout = "";
}

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
    @{Html.RenderAction("Head", "Header");}
</head>
<body>
    <div>
        Home
    </div>
</body>
</html>

다음은 렌더링 된 출력입니다 !!

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <link href="/Content/Site.css" rel="stylesheet" type="text/css" />
    <script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
    <script src="/Scripts/modernizr-1.7.min.js" type="text/javascript"></script>
</head>

<body>
    header
</body>
</html>
</head>
<body>
    <div>
        Home
    </div>
</body>
</html>

null렌더링 된 페이지에 단어 가 표시됩니까?
SLaks 2011

기본 레이아웃을 어디에 설정하고 있습니까?
SLaks

이 디렉토리에 _viewstart.cshtml이 있습니까? _viewstart를 사용하려고 할 때 겪었던 동일한 문제가 발생했습니다. 그런 다음 이름을 _mydefaultview로 변경하고 views / shared 디렉토리로 이동 한 다음 원하지 않는 cshtml 파일에보기를 지정하지 않고 나머지는 _mydefaultview를 지정하는 것으로 전환했습니다. 이것이 왜 필요한지 모르지만 효과가있었습니다.
DMulligan 2011

답으로 설정해 주시면 정답으로 표시하겠습니다. 확실히 면도기의 버그일까요?

버그인지, _viewstarts가 덮어 쓰여지지 않았는지, 아니면 뭔가 잘못했는지 잘 모르겠습니다. 저도 알고 싶습니다.
DMulligan 2011

답변:


14

당신은 가지고 있습니까 _ViewStart.cshtml이 디렉토리를? _ViewStart를 사용하려고 할 때와 동일한 문제가 발생했습니다. 그런 다음 이름을 _mydefaultview로 변경하고 Views/Shared디렉터리 로 이동 한 다음 원하지 않는 cshtml 파일에보기를 지정하지 않고 나머지는 _mydefaultview를 지정하는 것으로 전환했습니다. 이것이 왜 필요한지 모르지만 효과가있었습니다.


이상하게 들립니다. 는 _ViewStart이 문제가 발생해서는 안 뷰의 코드 전에 실행해야합니다. _ViewStart에 특이한 점이 있습니까?
SLaks

@ SLaks ♦ 테스트 할 "Hello World"만 포함하는 _viewstart를 만들었는데 Layout = null을 지정하더라도 Hello World가 계속 표시됩니다. 그러나 _mydefaultview를 레이아웃으로 지정하면 그것도 나타납니다. "hello world"는 _mydefaultview에 @RenderBody ()가있는 태그 사이에 표시됩니다.
DMulligan 2011

4
당신은 오해하고 _ViewStart있습니다. 내 대답을 참조하십시오.
SLaks

161

나는 이것을 생각 해요 :

@{
    Layout = "";
 }

다음과 같지 않습니다.

@{
    Layout = null;
 }

두 번째를 사용하고 작동하며 _Viewstart가 포함되어 있지 않습니다.


4
이 질문에 대한 정답이 아닌 이유는 무엇입니까?
Pinski

1
후자는 나를 위해 일했고 가장 먼저 떠오르는 것입니다.
Stonetip

@Pinski는 아마도 2 년 후에 추가 되었기 때문일 것입니다. :)
WildJoe 2017

35

당신 (그리고 KMulligan)은 _ViewStart페이지를 오해하고 있습니다.

_ViewStart것입니다 항상 페이지가 시작되기 전에 실행합니다.
속성 (예 :)을 초기화하는 데 사용됩니다 Layout. 일반적으로 마크 업을 포함해서는 안됩니다. (재정의 할 방법이 없기 때문에).

올바른 패턴은를 호출하는 별도의 레이아웃 페이지를 만들고 에서이 페이지를 가리 키도록 속성을 RenderBody설정하는 것 Layout입니다 _ViewStart.

그런 다음 Layout콘텐츠 페이지 를 변경할 수 있으며 변경 사항이 적용됩니다.


_Layout.cshtml모든 기본 디자인이 포함되어 있습니다. 을 _ViewStart.cshtml호출합니다 _Layout.cshtml. 내 앱의 각 모듈에는 자체 레이아웃 페이지가 있지만 해당 레이아웃은 기본 _Layout.cshtml. mvc 앱이 viewstart에서 시작되기 때문에 내 유일한 해결책은 viewstart 내부의 모든 것을 주석 처리하는 것입니다. 다른 페이지에서 이미를 사용하고 있었기 때문에 추가 문제가 발생하지 않습니다 _Layout.cshtml. 아주 간단합니다.
Wahid Masud

23

나는 그것이 개별 "보기"로 작업하는 것이 더 낫다고 생각한다. 나는 PHP에서 MVC4로 옮기려고 노력하고있다. 정말 힘들지만 올바른 길을 가고있다.

질문에 답하고 개별 페이지를 작업하려면 _ViewStart.cshtml

@{
  Layout = null;
}

CSS 경로에 문제가있는 경우 또 다른 팁 ...

URL 앞에 "../"를 넣으십시오.

이것이 제가 오늘받는 두 가지 문제이며, 저는 그렇게 해결합니다!

문안 인사;


21

뷰가 레이아웃을 사용해야하는지 여부를 결정하는 논리_viewStartView. 기본값을 설정하는 _viewStart것은 좋지만 view / viewstart에 레이아웃 로직을 추가하면 해당 뷰가 다른 곳에서 (레이아웃 유무에 관계없이) 사용되지 않습니다.

컨트롤러 작업은 다음과 같아야합니다.

return PartialView()

이러한 유형의 논리를 뷰에 배치하면 M (데이터), V (시각적), C (로직) 의 단일 책임 원칙 규칙 을 위반하게 됩니다.


이것은 Scott Gu가 여기서 말하는 weblogs.asp.net/scottgu/asp-net-mvc-3-layouts와 반대 입니다. we could write code within our _ViewStart.cshtml file to programmatically set the Layout property for each View ... we could vary the Layout template that we use depending on what type of device is accessing the site – and have a phone or tablet optimized layout for those devices그는 로직을 사용하여 레이아웃을 전환하는 장소로 _viewstart를 분명히 홍보하고 있습니다 (컨트롤러 및 액션 필터도 언급). 따라서 레이아웃을 전환 할 위치에 대한 절대 값보다는 선호도의 문제입니다.
rism

내가 선호하는 것은 디자인 패턴을 고수하는 것입니다. 보기에 데이터베이스 액세스를 던질 수 있습니다. 또한 나쁜 습관이거나 "선호의 문제"입니다.
Erik Philips

"view / viewstart에 레이아웃 로직을 추가하면 해당 뷰가 다른 곳에서 사용되는 것을 방지합니다."라는 문장처럼 상당히 쌍곡선 반응입니다. 전적으로 해당 응용 프로그램에 따라 다릅니다. 주어진 뷰가 레이아웃 (마스터) 파일에 의존하지 않는 수많은 예가 있습니다. 마스터는 브랜딩 또는 탐색을 위해 단순히 거기에 있으며 우리가 원하는 것은 모바일과 데스크톱 레이아웃 사이를 전환하는 것입니다 (유동적 레이아웃은 제외). 컨트롤러가이 컨텍스트에서 레이아웃 전환을 담당하게함으로써 실제로 SRP를 중단한다고 주장 할 수도 있습니다.
rism

나는 당신의 마지막 진술에서 당신의 관점을 보지 못합니다. 보기는 데이터의 표현입니다. 해당 뷰의 모든 로직은 다른 곳에서는 사용할 수 없으며 일반적으로 컨트롤러에서 발생하는 해당 로직의 테스트를 방지합니다. 컨트롤러에는 올바른 표시를 결정하기 위해 이미 MVC ( IsAjaxRequest 또는 ChildActionOnly )에 내장 된 논리가 있습니다.
Erik Philips

1
여기서 우리는 ViewResult에 특정한 _ViewStart에 대해 이야기하고 있습니다. 따라서 .. may or may not (JSON/XML) not even be Html rendered by a View Engine아무런 의미가 없습니다. _layout은보기를 래핑하는보기 일뿐입니다. (모두로 시작하는 것은 아닙니다 <!DOCTYPE html>). 따라서 요일과 같은 일부 속성에 따라 _ViewStart가 _layouts를 켜고 끄는 것이 완벽하게 가능할 수 있습니다. 주어진 컨텍스트에서 SRP 범위를 벗어난 ViewA를 삽입 할 _layout 페이지를 결정하는 ViewA에 대한 ControllerA를 갖도록 SRP를 중단 할 수 있습니다. ViewA <> ViewModelA를 지원하기 위해서만 존재합니다.
rism

11

사용하다:

@{
    Layout = null;
 }

_ViewStart에 지정된 레이아웃을 제거합니다.


2

레이아웃 파일이 사용되지 않도록 뷰를 부분 뷰로 생성하기 만하면됩니다.


2

레이아웃없이 로그인 페이지를 표시하고 싶었고 이것은 나에게 꽤 잘 작동합니다. (이것은 _ViewStart.cshtml 파일입니다) 컨트롤러에서 ViewBag.Title을 설정해야합니다.

@{
    if (! (ViewContext.ViewBag.Title == "Login"))
    {
        Layout = "~/Views/Shared/_Layout.cshtml";        
    } 
}

조금 늦었다는 것을 알고 있지만 이것이 몸에 도움이되기를 바랍니다.


2

절차 1 : Views 폴더의 루트 디렉터리에있는 _ViewStart 파일을 사용하여 레이아웃 렌더링 제어

이 방법은 초보자가 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;
 }

절차 2 : ActionResult에서 반환하여 레이아웃 설정

ASP.NET MVC의 가장 큰 기능 중 하나는 ActionResult에서 레이아웃을 반환하여 기본 레이아웃 렌더링을 재정의 할 수 있다는 것입니다. 따라서 이것은 ASP.NET MVC 응용 프로그램에서 다른 레이아웃을 렌더링하는 방법이기도합니다. 다음 코드 샘플은 수행 방법을 보여줍니다.

public ActionResult Index()
{
 SampleModel model = new SampleModel();
 //Any Logic
 return View("Index", "_WebmasterLayout", model);
}

절차 3 :보기-현명한 레이아웃 (상단의 각보기 내에서 레이아웃을 정의하여)

ASP.NET MVC는 뷰에서 레이아웃을 정의하여 기본 레이아웃 렌더링을 재정의 할 수있는 뛰어난 기능과 ​​팩스 기능을 제공합니다. 이를 구현하기 위해 각 뷰에서 다음과 같은 방식으로 코드를 작성할 수 있습니다.

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

절차 4 : 각 디렉토리에 _ViewStart 파일 배치

이것은 ASP.NET MVC 응용 프로그램의 각 컨트롤러에 대해 서로 다른 레이아웃을 설정하는 매우 유용한 방법입니다. 각 디렉토리에 대한 기본 레이아웃을 설정하려면 아래와 같이 필요한 레이아웃 정보가있는 각 디렉토리에 _ViewStart 파일을 배치하면됩니다.

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

-2

앱으로 작업하는 경우 청소 솔루션을 시도하십시오. 나를 위해 수정되었습니다.

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