2011-07-07 163 views
44

在我看來,當我有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> 
+0

請告訴我們你的代碼。 – SLaks

+0

你是否在渲染的頁面中看到單詞'null'? – SLaks

+0

@slaks - nope see above – iwayneo

回答

6

你在這個目錄下有一個_viewstart.cshtml文件嗎?當我嘗試使用_viewstart時,我遇到了同樣的問題。然後我將它重新命名爲_mydefaultview,將它移動到views/shared目錄,然後切換到不指定cshtml文件中我不想要的視圖,併爲其餘指定_mydefaultview。不知道爲什麼這是必要的,但它的工作。

+0

聽起來很奇怪。 '_ViewStart'應該在視圖中的代碼之前運行,所以這個問題不應該發生。你的_ViewStart有什麼不尋常的東西嗎? – SLaks

+0

@ SLaks♦我做了一個僅包含「Hello World」的_viewstart來測試,即使指定了Layout = null,Hello World仍然顯示出來。但是,如果我將_mydefaultview指定爲佈局,那麼它也會顯示出來。 「hello world」顯示在_mydefaultview中的@RenderBody()之間。 – DMulligan

+3

你誤解了_ViewStart。看到我的答案。 – SLaks

28

你(和KMulligan)誤解_ViewStart頁面。

_ViewStart總是在您的頁面啓動之前執行。
它旨在用於初始化屬性(如Layout);它通常不應該包含標記。 (因爲沒有辦法覆蓋它)。

正確的模式是製作一個單獨的佈局頁面,該頁面調用RenderBody,並將Layout屬性設置爲指向_ViewStart中的此頁面。

然後,您可以在您的內容頁面中更改Layout,更改將生效。

74

我想這:

@{ 
    Layout = ""; 
} 

是不一樣的:

@{ 
    Layout = null; 
} 

我用的是第二,它的工作,沒有_Viewstart包括在內。

+3

這不是這個問題的正確答案嗎? – Pinski

+0

後者爲我工作,是第一個想到的事情。 – Stonetip

+0

@Pinski可能是因爲它是在2年後添加的。 :) – WildJoe

1

只需將視圖創建爲局部視圖,以便不使用佈局文件。

+0

可悲的莫名其妙地不能在MVC5中工作 – mcy

5

我認爲這是與個人「意見」,我試着從PHP移動到MVC4,它真的很難,但在正確的道路IM更好的工作......

回答你的問題,如果你個人工作頁面,只需編輯_ViewStart.cshtml

@{ 
    Layout = null; 
} 

,如果你要使用CSS路徑的一些問題的另一條建議...

PUT 「../」 之前的url

這是我今天得到的兩個問題,我以這種方式解決!

問候;

11

用於確定是否查看應該使用佈局或不不應當在_viewStart也不View邏輯。在_viewStart中設置默認值是可以的,但在view/viewstart中添加任何佈局邏輯可以防止在其他任何地方使用該視圖(使用或不使用佈局)。

控制器動作應:

return PartialView() 

通過將這種類型的邏輯在查看你打破了M(數據)Single responsibility principle規則,V(視覺),C(邏輯)。

+0

這與Scott Gu在這裏所說的相反http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts。 '我們可以在我們的_ViewStart.cshtml文件中編寫代碼,以編程方式爲每個視圖設置佈局屬性......我們可以根據訪問網站的設備類型改變我們使用的佈局模板 - 並優化手機或平板電腦這些設備的佈局「他顯然將_viewstart作爲使用邏輯來切換佈局的地方(也提到控制器和動作過濾器)。所以它更多的是偏好問題而不是絕對問題:在哪裏切換佈局。 – rism

+0

我的首選是堅持設計模式。您可能會在您的視圖中拋出數據庫訪問權限,這也是不好的做法或「偏好問題」。 –

+0

這是一個相當誇張的反應,因爲「在視圖/ viewstart中添加任何佈局邏輯都會阻止該視圖在其他任何地方使用」。它完全取決於有問題的應用程序。有無數的例子,其中給定的視圖不依賴於它的佈局(主)文件。主人只是爲了一些品牌或導航,我們可能想要做的是在移動和桌面佈局之間切換(不考慮流體佈局)。人們甚至可以爭辯說,通過讓控制器也負責在這種情況下切換佈局,你實際上打破了SRP。 – rism

2

我想顯示沒有佈局登錄頁面,這個作品非常適合我。(這是_ViewStart.cshtml文件) 您需要設置ViewBag.Title在控制器中。

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

我知道這有點晚,但我希望這有助於某些身體。

6

用途:

@{ 
    Layout = null; 
} 

擺脫在_ViewStart指定的佈局。

1

步驟1:控制佈局呈現由瀏覽器的根目錄使用_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爲我們提供了這樣一個很大的特點& faxibility通過覆蓋默認佈局呈現定義視圖上的佈局。爲了實現這一點,我們可以按照以下方式在每個視圖中編寫代碼。

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

步驟4:配售_ViewStart文件中的每個目錄

的這是在你的ASP.NET MVC應用程序的每個控制器設置不同的佈局一個非常有用的方式。如果我們要設置默認佈局爲每個目錄比我們可以通過將_ViewStart文件中的每個與所需的佈局信息的目錄的做到這一點,如下圖所示:

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