Бритва без макета


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на відтвореній сторінці?
Слакс

Де ви встановлюєте макет за замовчуванням?
Слакс

У вас є _viewstart.cshtml у цьому каталозі? У мене була та сама проблема, що і у вас, коли я намагався використовувати _viewstart. Потім я перейменував його _mydefaultview, перемістив у каталог views / shared і перейшов до вказівки відсутності подання у файлах cshtml там, де я цього не хочу, а для решти - _mydefaultview. Не знаю, навіщо це було потрібно, але це спрацювало.
DMulligan

будь ласка, встановіть це як відповідь, і я позначу його правильним. це, мабуть, помилка в бритві?

Я не впевнений, що це помилка, _viewstarts призначені не для перезапису, або якщо ми зробили щось не так. Я теж хотів би це знати.
DMulligan

Відповіді:


14

У вас є _ViewStart.cshtmlв цьому каталозі? У мене була та сама проблема, що і у вас, коли я намагався використовувати _ViewStart. Потім я перейменував його _mydefaultview, перемістив у Views/Sharedкаталог і перейшов до зазначення відсутності подання у файлах cshtml там, де я його не хочу, а для решти - _mydefaultview. Не знаю, навіщо це було потрібно, але це спрацювало.


Це звучить дивно. The _ViewStartповинен запускатися перед кодом у поданні, тому ця проблема не повинна відбуватися. У вас є щось незвичне у вашому _ViewStart?
Слакс

@ SLaks ♦ Я зробив _viewstart, який просто містить "Hello World" для тестування, і Hello World все ще відображається, навіть якщо я вказав Layout = null. Однак, якщо я вказав _mydefaultview як макет, то це теж відображається. "Привіт світ" відображається між тегами, де у мене є @RenderBody () у _mydefaultview.
DMulligan

4
Ви неправильно розумієте _ViewStart. Дивіться мою відповідь.
Слакс

161

Я думаю це:

@{
    Layout = "";
 }

не те саме, що це:

@{
    Layout = null;
 }

Я використовую другий, і він працює, не включаючи _Viewstart.


4
Як це не правильна відповідь на це запитання?
Пінський,

1
Останнє працювало на мене і було першим, що мені спало на думку.
Stonetip

@Pinski, мабуть, тому, що його додали через 2 роки. :)
WildJoe

35

Ви (і KMulligan) - _ViewStartсторінки нерозуміння .

_ViewStartзавжди буде виконуватися до початку вашої сторінки.
Він призначений для використання для ініціалізації властивостей (таких як Layout); як правило, він не повинен містити розмітку. (Оскільки це неможливо замінити).

Правильний шаблон - це зробити окрему сторінку макета, яка викликає RenderBody, і встановити Layoutвластивість, щоб вона вказувала на цю сторінку_ViewStart .

Потім ви можете змінити Layoutсвої сторінки вмісту, і зміни набудуть чинності.


ну мій _Layout.cshtmlмістить усі основні конструкції. і _ViewStart.cshtmlвикликає _Layout.cshtml. кожен модуль мого додатка має свою сторінку макета, але цей макет використовує основну _Layout.cshtml. оскільки додаток mvc починається з viewstart, я думаю, моє єдине рішення було прокоментувати все, що знаходиться всередині viewstart. і це не викликає жодних додаткових проблем, оскільки інші сторінки вже використовували _Layout.cshtml. досить просто.
Вахід Масуд

23

Я думаю, що краще працювати з окремими "поглядами", я намагаюся перейти з PHP на MVC4, це дійсно важко, але я на правильному шляху ...

Відповідаючи на ваше запитання, якщо ви будете працювати на окремих сторінках, просто відредагуйте _ViewStart.cshtml

@{
  Layout = null;
}

Ще одна порада, якщо у вас виникають проблеми з CSS-шляхом ...

Поставте "../" перед URL-адресою

Це дві проблеми, які виникають у мене сьогодні, і я їх вирішую таким чином!

З повагою;


21

Логіка для визначення того, чи повинен подання використовувати макет чи ні, НЕ повинна бути в _viewStartні View. Встановлення за замовчуванням в_viewStart - це нормально, але додавання будь-якої логіки макета у поданні / viewstart заважає використовувати цей вигляд де-небудь ще (з макетом або без нього).

Дія контролера повинна:

return PartialView()

Поміщаючи цей тип логіки у поданні, ви порушуєте правило принципу єдиної відповідальності в M (дані), V (візуально), C (логіка).


Це суперечить тому, що тут говорить Скотт Гу 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 як місце для використання логіки для перемикання макетів (також згадує контролери та фільтри дій). Тож це більше питання переваги, аніж абсолютного питання: де змінити макети.
різм

Моя перевага - дотримуватися шаблонів дизайну. Ви можете передати доступ до бази даних на свій погляд, це також погана практика або "питання переваг".
Ерік Філіпс,

Це досить гіперболічна відповідь, оскільки вислів "додавання будь-якої логіки макета у поданні / viewstart запобігає використанню цього подання де-небудь ще". Це повністю залежить від розглядуваної заявки. Існує незліченна кількість прикладів, коли даний вигляд не залежить від його макета (головного) файлу. Майстер просто готовий до якогось брендингу чи навігації, і все, що нам може знадобитися, - це переключитись між мобільним та настільним макетом (макети рідини в сторону). Можна навіть стверджувати, що ви насправді порушуєте SRP, роблячи контролер також відповідальним за перемикання макетів у цьому контексті.
різм

Я не бачу вашої точки зору щодо вашого останнього висловлювання. Вигляд - це подання даних. Будь-яка логіка в цьому поданні означає, що вона не може бути використана деінде і запобігає тестуванню цієї логіки, яке зазвичай відбувається в контролері. Контролер має логіку, вже вбудовану в MVC ( IsAjaxRequest або ChildActionOnly ), щоб визначити правильну презентацію.
Ерік Філіпс,

1
Тут ми говоримо про _ViewStart, який є специфічним для ViewResult. Так.. may or may not (JSON/XML) not even be Html rendered by a View Engine що не має ніякого відношення. _Layout - це просто подання, яке обгортає подання. (Не всі вони починаються з <!DOCTYPE html>). Тож може бути цілком здійснено, щоб _ViewStart вмикав та вимикав _лайти відповідно до якоїсь властивості, тобто дня тижня. У даному контексті, це може порушити SRP, щоб мати ControllerA для ViewA, який визначить, на яку сторінку _layout вводити ViewA, оскільки це виходить за рамки SRP. Він існує лише для підтримки ViewA <> ViewModelA.
різм

11

Використання:

@{
    Layout = null;
 }

щоб позбутися макета, зазначеного в _ViewStart.


2

Просто створіть подання як часткове, щоб не використовувався файл макета.


2

Я хотів відобразити сторінку входу без макета, і це працює для мене досить добре. (Це файл _ViewStart.cshtml) Вам потрібно встановити ViewBag.Title у контролері.

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

Я знаю, що це трохи пізно, але я сподіваюся, це допоможе якомусь організму.


2

Процедура 1: Управління відтворенням макетів за допомогою файлу _ViewStart у кореневому каталозі папки Views

Цей метод є найпростішим способом для початківців контролювати візуалізацію макетів у вашому додатку ASP.NET MVC. Ми можемо ідентифікувати контролер і зробити Layouts як номіналом контролера, для цього ми можемо записати наш код у файл _ViewStart у кореневій директорії папки Views. Наведений нижче приклад показує, як це можна зробити.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.