2011-07-07 40 views
44

Làm cách nào khi tôi có Layout = null; trong chế độ xem của tôi - nó vẫn kéo theo bố cục mặc định ?!Chế độ xem dao cạo không có bố cục

Có một số mẹo để ngăn chặn điều đó không?

Đây là quan điểm của tôi mà không cần bố trí:

@{ 
    Layout = ""; 
} 

<!DOCTYPE html> 

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

Đây là kết quả trả lại !!

<!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

Hãy cho chúng tôi thấy mã của bạn. – SLaks

+0

Bạn có thấy từ 'null' trong trang được hiển thị không? – SLaks

+0

@slaks - không nhìn thấy ở trên – iwayneo

Trả lời

6

Bạn có _viewstart.cshtml trong thư mục này không? Tôi đã gặp vấn đề tương tự khi bạn thử dùng _viewstart. Sau đó, tôi đổi tên nó thành _mydefaultview, chuyển nó vào thư mục views/shared, và chuyển sang chỉ định không xem trong các file cshtml mà tôi không muốn nó, và chỉ định _mydefaultview cho phần còn lại. Không biết tại sao điều này là cần thiết, nhưng nó hoạt động.

+0

Nghe có vẻ lạ. '_ViewStart' sẽ chạy trước mã trong khung nhìn, vì vậy vấn đề này không nên xảy ra. Bạn có bất cứ điều gì bất thường trong _ViewStart của bạn không? – SLaks

+0

@ Slaks ♦ Tôi đã tạo một _viewstart chỉ chứa "Hello World" để kiểm tra, và Hello World vẫn xuất hiện ngay cả khi tôi chỉ định Layout = null. Tuy nhiên, nếu tôi chỉ định _mydefaultview làm bố cục thì nó cũng xuất hiện. "Hello world" hiển thị các thẻ inbetween nơi tôi có @RenderBody() trong _mydefaultview. – DMulligan

+3

Bạn hiểu sai '_ViewStart'. Xem câu trả lời của tôi. – SLaks

28

Bạn (và KMulligan) là sự hiểu lầm _ViewStart trang.

_ViewStart sẽ luôn thực hiện, trước khi trang của bạn bắt đầu.
Nó được thiết kế để được sử dụng để khởi tạo các thuộc tính (chẳng hạn như Layout); nó thường không nên chứa đánh dấu. (Vì không có cách nào để ghi đè lên nó).

Mẫu chính xác là tạo trang bố cục riêng lẻ gọi RenderBody và đặt thuộc tính Layout để trỏ đến trang này trong _ViewStart.

Sau đó, bạn có thể thay đổi Layout trong các trang nội dung của mình và các thay đổi sẽ có hiệu lực.

74

Tôi nghĩ rằng đây:

@{ 
    Layout = ""; 
} 

không giống như thế này:

@{ 
    Layout = null; 
} 

tôi sử dụng thứ hai và nó làm việc, không bao gồm _Viewstart.

+3

Đây không phải là câu trả lời đúng cho câu hỏi này? – Pinski

+0

Sau này làm việc cho tôi và là điều đầu tiên tôi nghĩ đến. – Stonetip

+0

@Pinski có lẽ vì nó đã được thêm 2 năm sau đó. :) – WildJoe

1

Chỉ cần tạo chế độ xem làm chế độ xem từng phần để không sử dụng tệp bố cục.

+0

Thật đáng buồn bằng cách nào đó mà không làm việc trong MVC5 – mcy

5

Tôi nghĩ rằng đó là công việc tốt hơn với "quan điểm" cá nhân, Im cố gắng để di chuyển từ PHP để MVC4, nó thực sự khó khăn nhưng im trên một cách đúng đắn ...

Trả lời câu hỏi của bạn, nếu bạn sẽ làm việc cá nhân trang, chỉ cần chỉnh sửa các _ViewStart.cshtml

@{ 
    Layout = null; 
} 

một mẹo nếu bạn đang nhận được một số vấn đề với đường dẫn CSS ...

Đặt "../" trước của url

Đây là 2 vấn đề mà tôi nhận được ngày hôm nay, và tôi giải quyết theo cách đó!

Kính trọng;

11

Logic để xác định xem Chế độ xem có nên sử dụng bố cục hay không không được ở trong _viewStart cũng không phải View.Đặt mặc định trong _viewStart là tốt, nhưng thêm bất kỳ logic bố cục nào trong chế độ xem/khung nhìn ngăn không cho sử dụng chế độ xem đó ở bất kỳ nơi nào khác (có hoặc không có bố cục).

điều khiển hành động của bạn nên:

return PartialView() 

Bằng cách đặt kiểu này logic trong View bạn phá vỡ quy tắc trong Single responsibility principle M (dữ liệu), V (thị giác), C (logic).

+0

Điều này trái với những gì Scott Gu nói ở đây http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts. 'chúng ta có thể viết mã trong tệp _ViewStart.cshtml của chúng tôi để đặt thuộc tính Bố cục cho mỗi Chế độ xem ... chúng tôi có thể thay đổi mẫu Bố cục mà chúng tôi sử dụng tùy thuộc vào loại thiết bị nào đang truy cập trang web - và tối ưu hóa điện thoại hoặc máy tính bảng bố trí cho các thiết bị đó 'Ông rõ ràng đang quảng cáo _viewstart như một nơi để sử dụng logic để chuyển đổi bố trí (cũng đề cập đến bộ điều khiển và bộ lọc hành động). Vì vậy, nó là một vấn đề ưu tiên hơn so với tuyệt đối lại: nơi để chuyển đổi bố trí. – rism

+0

Sở thích của tôi là gắn bó với các mẫu thiết kế. Bạn có thể ném truy cập cơ sở dữ liệu trong quan điểm của bạn, nó cũng là thực hành xấu hoặc "một vấn đề ưu tiên". –

+0

Đó là một phản ứng khá hyperbolic như là tuyên bố "thêm bất kỳ logic bố trí trong xem/viewstart ngăn cản rằng xem được sử dụng bất cứ nơi nào khác". Nó phụ thuộc hoàn toàn vào ứng dụng được đề cập. Có vô số ví dụ trong đó một khung nhìn nhất định không phụ thuộc vào tệp layout (chính) của nó. Các bậc thầy chỉ đơn giản là có cho một số xây dựng thương hiệu hoặc nav và tất cả chúng ta có thể muốn làm là chuyển đổi giữa một bố trí điện thoại di động và máy tính để bàn của rằng (bố trí chất lỏng sang một bên). Một thậm chí có thể lập luận rằng bạn thực sự phá vỡ SRP bằng cách làm cho một bộ điều khiển cũng có trách nhiệm chuyển đổi bố trí trong bối cảnh này. – rism

2

Tôi muốn hiển thị trang đăng nhập không có bố cục và điều này hoạt động khá tốt đối với tôi. (Đây là tệp _ViewStart.cshtml) Bạn cần đặt ViewBag.Title trong Bộ điều khiển.

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

Tôi biết đã muộn một chút nhưng tôi hy vọng điều này sẽ giúp một số nội dung.

6

Sử dụng:

@{ 
    Layout = null; 
} 

để thoát khỏi bố trí quy định tại _ViewStart.

1

Thủ tục 1: Kiểm soát Layouts vẽ bằng cách sử dụng tập tin _ViewStart trong thư mục gốc của thư mục Views

Phương pháp này là cách đơn giản nhất cho người mới bắt đầu để kiểm soát Layouts đang hiển thị trong ứng dụng ASP.NET MVC của bạn. Chúng ta có thể xác định controller và render Layouts như par controller, để làm điều này chúng ta có thể viết code của chúng ta trong file _ViewStart trong thư mục gốc của thư mục Views. Sau đây là một ví dụ cho thấy làm thế nào nó có thể được thực hiện.

@{ 
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; 
} 

Thủ tục 2: Set Layout bởi Trở về từ ActionResult

Một sự các tính năng tuyệt vời của ASP.NET MVC là, chúng ta có thể ghi đè lên vẽ bố trí mặc định bằng cách trả lại bố trí từ ActionResult. Vì vậy, đây cũng là một cách để render Layout khác nhau trong ứng dụng ASP.NET MVC của bạn. Sau mẫu mã cho thấy làm thế nào nó có thể được thực hiện.

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

Thủ tục 3: View - Giao diện khôn ngoan (Bằng việc xác định diện trong mỗi quan điểm trên đầu)

ASP.NET MVC cho chúng ta như một lớn tính năng & faxibility để ghi đè lên vẽ bố trí mặc định bằng cách xác định bố trí trên màn hình. Để thực hiện điều này, chúng tôi có thể viết mã của chúng tôi theo cách sau trong mỗi Chế độ xem.

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

Thủ tục 4: Đặt tập tin _ViewStart trong mỗi thư mục

Đây là một cách rất hữu ích để thiết lập Layouts khác nhau cho mỗi bộ điều khiển trong ứng dụng ASP.NET MVC của bạn. Nếu chúng ta muốn thiết lập Layout mặc định cho mỗi thư mục hơn chúng ta có thể làm điều này bằng cách đặt file _ViewStart vào mỗi thư mục với thông tin Layout cần thiết như hình dưới:

@{ 
    Layout = "~/Views/Shared/_WebmasterLayout.cshtml"; 
} 
Các vấn đề liên quan