レイアウトなしのかみそりビュー


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 2011

このディレクトリに_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 2011

@ SLaks♦テストする「HelloWorld」のみを含む_viewstartを作成しましたが、Layout = nullを指定してもHelloWorldが表示されます。ただし、レイアウトとして_mydefaultviewを指定すると、それも表示されます。「helloworld」は、_mydefaultviewに@RenderBody()があるタグの間に表示されます。
DMulligan 2011

4
あなたは誤解してい_ViewStartます。私の答えを見てください。
SLaks 2011

161

私はこれだと思います:

@{
    Layout = "";
 }

これと同じではありません:

@{
    Layout = null;
 }

私は2番目を使用し、それは機能しています。_Viewstartは含まれていません。


4
これはどうしてこの質問の正解ではないのですか?
ピンスキー2017年

1
後者は私のために働き、最初に頭に浮かんだことでした。
ストーンチッ​​プ2017

@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 2018

23

個々の「ビュー」で作業する方が良いと思います。PHPからMVC4に移行しようとしています。本当に難しいですが、正しい方向に進んでいます...

質問に答えて、個々のページで作業する場合は、_ViewStart.cshtmlを編集するだけです。

@{
  Layout = null;
}

CSSパスで問題が発生した場合のもう1つのヒント...

URLの前に「../」を付けます

これが私が今日受ける2つの問題であり、私はそのようにして解決します!

よろしく;


21

論理ビューにすべきではないレイアウトを使用するか、またはべきでないかどうかを決定するため_viewStartにもView。にデフォルトを設定すること_viewStartは問題ありませんが、ビュー/ビュースタートにレイアウトロジックを追加すると、そのビューが他の場所(レイアウトの有無にかかわらず)で使用されなくなります。

コントローラのアクションは次のようにする必要があります。

return PartialView()

このタイプのロジックをビューに配置することにより、M(データ)、V(ビジュアル)、C(ロジック)の単一責任の原則ルールに違反します。


これは、ScottGuがここで言う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 2015年

私の好みは、デザインパターンに固執することです。あなたはあなたの見解にデータベースアクセスを投げることができます、それはまた悪い習慣または「好みの問題」です。
エリックフィリップス2015年

「ビュー/ビュースタートにレイアウトロジックを追加すると、そのビューが他の場所で使用されなくなる」というステートメントと同様に、これはかなり双曲線的な応答です。それは問題のアプリケーションに完全に依存します。特定のビューがそのレイアウト(マスター)ファイルに依存しない例は無数にあります。マスターは単にブランディングやナビゲーションのためにそこにいて、私たちがやりたいのはそのモバイルとデスクトップのレイアウトを切り替えることだけです(流体レイアウトは別として)。このコンテキストでのレイアウトの切り替えもコントローラーに任せることで、実際にSRPを破ると主張することもできます。
rism 2015年

あなたの最後の発言についてあなたの見解はわかりません。ビューはデータの表示です。そのビューのロジックは、他の場所では使用できないことを意味し、コントローラーで通常発生するロジックのテストを妨げます。コントローラーには、正しい表示を決定するためのロジック(IsAjaxRequestまたはChildActionOnly)が既に組み込まれています。
Erik Philips 2015年

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のControllerAが、SRPの範囲を超えているためにViewAを挿入する_layoutページを決定する可能性があります。ViewA <> ViewModelAをサポートするためにのみ存在します。
rism 2015年

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.NETMVCアプリケーションでレイアウトレンダリングを制御するための最も簡単な方法です。コントローラを識別し、レイアウトをパーコントローラとしてレンダリングできます。これを行うには、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の優れた機能の1つは、ActionResultからレイアウトを返すことで、デフォルトのレイアウトレンダリングをオーバーライドできることです。したがって、これはASP.NETMVCアプリケーションで異なるレイアウトをレンダリングする方法でもあります。次のコードサンプルは、その方法を示しています。

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.NETMVCアプリケーションのコントローラーごとに異なるレイアウトを設定するための非常に便利な方法です。各ディレクトリにデフォルトのレイアウトを設定する場合は、以下に示すように、必要なレイアウト情報を含む_ViewStartファイルを各ディレクトリに配置します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.