Просмотр бритвы без макета


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 07

Где вы устанавливаете макет по умолчанию?
SLaks 07

У вас есть _viewstart.cshtml в этом каталоге? У меня была та же проблема, что и у вас, когда я пытался использовать _viewstart. Затем я переименовал его в _mydefaultview, переместил в каталог views / shared и переключился на указание отсутствия представления в файлах cshtml, где он мне не нужен, и указание _mydefaultview для остальных. Не знаю, зачем это было нужно, но это сработало.
DMulligan 07

Пожалуйста, укажите это как ответ, и я помечу его как правильный. это наверняка ошибка в бритве?

Я не уверен, что это ошибка, _viewstarts не предназначены для перезаписи, или мы сделали что-то не так. Я тоже хотел бы знать.
DMulligan 07

Ответы:


14

У вас есть _ViewStart.cshtmlв этом каталоге? У меня была та же проблема, что и у вас, когда я пытался использовать _ViewStart. Затем я переименовал его в _mydefaultview, переместил в Views/Sharedкаталог и переключился на указание отсутствия представления в файлах cshtml там, где оно мне не нужно, и указание _mydefaultview для остальных. Не знаю, зачем это было нужно, но это сработало.


Звучит странно. Он _ViewStartдолжен запускаться перед кодом в представлении, поэтому этой проблемы не должно возникнуть. У вас есть что-нибудь необычное в вашем _ViewStart?
SLaks 07

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

4
Вы неправильно поняли _ViewStart. Смотрите мой ответ.
SLaks 07

162

Я думаю, что это :

@{
    Layout = "";
 }

это не то же самое:

@{
    Layout = null;
 }

Я использую второй, и он работает, _Viewstart не включен.


4
Почему это не правильный ответ на этот вопрос?
Пински

1
Последнее работало на меня и было первым, что пришло в голову.
Stonetip

@Pinski, вероятно, потому, что он был добавлен 2 года спустя. :)
WildJoe

35

Вы (и КМаллиган) - _ViewStartстраницы непонимания .

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

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

Затем вы можете изменить Layoutсодержание страниц, и изменения вступят в силу.


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

23

Я думаю, что лучше работать с отдельными "представлениями", я пытаюсь перейти с PHP на MVC4, это действительно сложно, но я на правильном пути ...

Отвечая на ваш вопрос, если вы будете работать с отдельными страницами, просто отредактируйте _ViewStart.cshtml

@{
  Layout = null;
}

Еще один совет, если у вас возникли проблемы с путем CSS ...

Поместите "../" перед URL

Это 2 проблемы, с которыми я столкнулся сегодня, и я решаю их таким образом!

С уважением;


21

Логика для определения того, должно ли представление использовать макет или нет, НЕ должно быть _viewStartни в View. Установка значения по умолчанию _viewStart- это нормально, но добавление любой логики макета в view / 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 как место, где можно использовать логику для переключения макетов (также упоминаются контроллеры и фильтры действий). Так что вопрос о том, где переключать раскладки, - это больше вопрос предпочтений, а не абсолютов.
rism

Я предпочитаю придерживаться шаблонов дизайна. Вы можете использовать доступ к базе данных в своем представлении, это тоже плохая практика или «вопрос предпочтений».
Эрик Филипс,

Это довольно гиперболический ответ, так как утверждение «добавление любой логики макета в представление / начало просмотра предотвращает использование этого представления где-либо еще». Это полностью зависит от рассматриваемого приложения. Существует бесчисленное множество примеров, в которых данное представление не зависит от его файла макета (главного). Мастер просто существует для некоторого брендинга или навигации, и все, что нам может понадобиться, - это переключиться между мобильным и настольным макетами (не считая гибких макетов). Можно даже утверждать, что на самом деле вы нарушаете SRP, заставляя контроллер также отвечать за переключение макетов в этом контексте.
rism

Я не понимаю вашей точки зрения на ваше последнее заявление. Представление - это представление данных. Любая логика в этом представлении означает, что ее нельзя использовать где-либо еще, и предотвращает тестирование этой логики, которое обычно происходит в контроллере. В контроллер уже встроена логика ( IsAjaxRequest или ChildActionOnly ) для определения правильного представления.
Эрик Филипс

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

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. Мы можем идентифицировать контроллер и отображать макеты как контроллер par, для этого мы можем написать наш код в файле _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.