Chế độ xem dao cạo không có bố cục


81

Tại sao khi tôi có Layout = null;trong chế độ xem của mình - nó vẫn kéo theo bố cục mặc định ?!

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

Đây là chế độ xem của tôi không có bố cục:

@{
    Layout = "";
}

<!DOCTYPE html>

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

Đây là kết quả hiển thị !!

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

Bạn có thấy từ nulltrong trang được kết xuất không?
SLaks vào

Bạn đang đặt bố cục mặc định ở đâu?
SLaks

Bạn có _viewstart.cshtml trong thư mục này không? Tôi đã gặp vấn đề tương tự mà bạn đang gặp phải khi thử sử dụng _viewstart. Sau đó, tôi đổi tên nó là _mydefaultview, chuyển nó vào thư mục views / shared và chuyển sang chỉ định không có chế độ xem nào trong các tệp cshtml nơi tôi không muố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.
DMulligan

vui lòng đặt đó làm câu trả lời và tôi sẽ đánh dấu là đúng. Đây chắc hẳn là một lỗi trong dao cạo?

Tôi không chắc liệu đó có phải là lỗi hay không, _viewstarts nhằm mục đích không bị ghi đè hoặc nếu chúng tôi đã làm sai điều gì đó. Tôi cũng muốn biết.
DMulligan

Câu trả lời:


14

Bạn có một _ViewStart.cshtmltrong thư mục này? Tôi đã gặp vấn đề tương tự như bạn đang gặp phải khi thử sử dụng _ViewStart. Sau đó, tôi đổi tên nó là _mydefaultview, chuyển nó vào Views/Sharedthư mục và chuyển sang chỉ định không có chế độ xem nào trong các tệp cshtml nơi tôi không muố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.


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

@ SLaks ♦ Tôi đã tạo một _viewstart chỉ chứa "Hello World" để kiểm tra và Hello World vẫn hiển thị 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ì điều đó cũng hiển thị. "Hello world" đang hiển thị giữa các thẻ mà tôi có @RenderBody () trong _mydefaultview.
DMulligan

4
Bạn đang hiểu sai _ViewStart. Hãy xem câu trả lời của tôi.
SLaks,

161

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ó đang hoạt động, không bao gồm _Viewstart.


4
Làm thế nào đây không phải là câu trả lời chính xác cho câu hỏi này?
Pinski

1
Cái thứ hai đã làm việc cho tôi và là điều đầu tiên tôi nghĩ đến.
Stonetip

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

35

Bạn (và KMulligan) đang hiểu nhầm _ViewStartcác trang.

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

Mẫu chính xác là tạo một trang bố cục riêng biệt sẽ gọi RenderBodyvà đặt thuộc Layouttính trỏ đến trang này _ViewStart.

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


cũng của tôi _Layout.cshtmlchứa tất cả các thiết kế cơ bản. và _ViewStart.cshtmlgọi _Layout.cshtml. mỗi mô-đun trong Ứng dụng của tôi có trang bố cục riêng nhưng những bố cục đó sử dụng chính _Layout.cshtml. vì ứng dụng mvc bắt đầu từ viewstart, tôi đoán giải pháp duy nhất của tôi là nhận xét mọi thứ bên trong viewstart. và điều đó không gây ra bất kỳ vấn đề gì thêm vì các trang khác đã được sử dụng _Layout.cshtml. khá đơn giản.
Wahid Masud

23

Tôi nghĩ nó hoạt động tốt hơn với các "lượt xem" riêng lẻ, Tôi đang cố gắng chuyển từ PHP sang MVC4, nó thực sự khó nhưng tôi đang đi đúng hướng ...

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

@{
  Layout = null;
}

Một mẹo khác nếu bạn đang gặp một số vấn đề với đường dẫn CSS ...

Đặt "../" trước 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 đó!

Trân trọng;


21

Logic để xác định xem một Chế độ xem có nên sử dụng bố cục hay không KHÔNG nên nằm trong dấu _viewStartcũng như View. Đặt mặc định trong _viewStartlà tốt, nhưng việc thêm bất kỳ logic bố cục nào trong view / viewstart sẽ ngăn chế độ xem đó được sử dụng ở bất kỳ nơi nào khác (có hoặc không có bố cục).

Hành động kiểm soát của bạn nên:

return PartialView()

Bằng cách đặt loại logic này trong Chế độ xem, bạn phá vỡ quy tắc Nguyên tắc trách nhiệm duy nhất trong M (dữ liệu), V (trực quan), C (logic).


Điều này trái với những gì Scott Gu nói ở đây 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 devicesAnh ấy rõ ràng đang quảng cáo _viewstart như một nơi sử dụng logic để chuyển đổi bố cục (cũng đề cập đến bộ điều khiển và bộ lọc hành động). Vì vậy, vấn đề ưu tiên hơn là tuyệt đối là: nơi chuyển đổi bố cục.
rism

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 quyền truy cập cơ sở dữ liệu vào chế độ xem của mình, đó cũng là một thực tiễn không tốt hoặc "vấn đề ưu tiên".
Erik Philips

Đó là một phản hồi khá hypebol giống như tuyên bố "thêm bất kỳ logic bố cục nào trong khung nhìn / khung nhìn sẽ ngăn chế độ xem đó được sử dụng ở bất kỳ nơi nào khác". Nó hoàn toàn phụ thuộc vào ứng dụng được đề cập. Có vô số ví dụ trong đó một dạng xem nhất định không phụ thuộc vào tệp bố cục (chính) của nó. Cái chính chỉ đơn giản là ở đó cho một số thương hiệu hoặc điều hướng và tất cả những gì chúng ta có thể muốn làm là chuyển đổi giữa bố cục thiết bị di động và máy tính để bàn (bố cục linh hoạt sang một bên). Người ta thậm chí có thể tranh luận rằng bạn thực sự phá vỡ SRP bằng cách tạo một bộ điều khiển cũng chịu trách nhiệm chuyển đổi bố cục trong bối cảnh này.
rism

Tôi không thấy quan điểm của bạn trong tuyên bố cuối cùng của bạn. Chế độ xem là bản trình bày dữ liệu. Bất kỳ logic nào trong khung nhìn đó có nghĩa là nó không thể được sử dụng ở nơi khác và ngăn cản việc kiểm tra logic đó thường xảy ra trong bộ điều khiển. Bộ điều khiển có logic đã được tích hợp sẵn trong MVC ( IsAjaxRequest hoặc ChildActionOnly ) để xác định bản trình bày chính xác.
Erik Philips

1
Ở đây chúng ta đang nói về _ViewStart dành riêng cho ViewResult. Vì vậy, .. may or may not (JSON/XML) not even be Html rendered by a View Enginekhông có mang. _Layout chỉ là một dạng xem bao bọc một dạng xem. (Không phải tất cả đều bắt đầu bằng <!DOCTYPE html>). Vì vậy, có thể hoàn toàn khả thi khi bật và tắt _ViewStart _layouts theo một số thuộc tính tức là ngày trong tuần. Trong một ngữ cảnh nhất định, nó có thể phá vỡ SRP để có ControllerA cho ViewA đưa ra một số quyết định về trang _layout nào sẽ đưa ViewA vào vì nó nằm ngoài phạm vi SRP của nó. Nó chỉ tồn tại để hỗ trợ ViewA <> ViewModelA.
rism

11

Sử dụng:

@{
    Layout = null;
 }

để thoát khỏi bố cục được chỉ định trong _ViewStart.


2

Chỉ cần tạo dạng xem dưới dạng một phần để không có tệp bố cục nào được sử dụng.


2

Tôi muốn hiển thị trang đăng nhập mà 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 là hơi muộn nhưng tôi hy vọng điều này sẽ giúp ích cho cơ thể.


2

Quy trình 1: Kiểm soát hiển thị Layouts bằng cách sử dụng tệp _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 để người mới bắt đầu kiểm soát việc kết xuất Bố cục trong ứng dụng ASP.NET MVC của bạn. Chúng tôi có thể xác định bộ điều khiển và hiển thị các Bố cục dưới dạng bộ điều khiển mệnh, để làm điều này, chúng tôi có thể viết mã của mình trong tệp _ViewStart trong thư mục gốc của thư mục Chế độ xem. Sau đây là một ví dụ cho thấy nó có thể được thực hiện như thế nào.

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

Quy trình 2: Đặt bố cục bằng cách quay lại từ ActionResult

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

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

Quy trình 3: Xem - Bố cục khôn ngoan (Bằng cách xác định Bố cục trong mỗi chế độ xem ở trên cùng)

ASP.NET MVC cung cấp cho chúng ta một tính năng và khả năng fax tuyệt vời như vậy để ghi đè kết xuất bố cục mặc định bằng cách xác định bố cục trên dạng xem. Để thực hiện điều này, chúng ta có thể viết mã của mình theo cách sau trong mỗi Chế độ xem.

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

Quy trình 4: Đặt tệp _ViewStart vào mỗi thư mục

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

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

-2

Nếu bạn đang làm việc với các ứng dụng, hãy thử dung dịch tẩy rửa. Đã sửa cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.