ASP.NET MVC: логика в _layout.cshtml, которая принимает переменные из заданного контроллера - PullRequest
1 голос
/ 21 октября 2010

Впервые в MVC, так что прости меня, если терминология немного не в порядке.

Я использую ASP.NET MVC3 beta и VS 2010.

Я не уверен, является ли это ошибкой концепции, синтаксиса или чего-то еще.

По сути, я хотел бы, чтобы для _layout.cshtml я хотел включить скрипт jQuery для любого контроллера, чей ActionResult устанавливает для ViewModel.UseJQuery значение true.

Я новичок в этом деле, поэтому могу ошибаться, но мне кажется, что лучший способ сделать это (то, что я сейчас пытаюсь) будет:

_layout.cshtml file :

 @if(View.UseJQuery)
    {
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js">
        </script>
        <script type="text/javascript">
        $(document).ready(function() {
            // This is more like it! SHOULDN'T BE SEEN IF UseJQuery is false!
        });
        </script>
    }

В различных контроллерах

  public ActionResult Index()
        {
            ViewModel.UseJQuery = false;
            ViewModel.Title = "Image Gallery";
            GalleryModel gm = new GalleryModel();
            ViewModel.Testy = gm.TestString;
            return View();
        }

Однако, это дает мне ошибку о необходимости преобразования нулевого значения в логическое значение (я полагаю, что он не находит флаг UseJQuery).

Итак, мой вопрос двоякий:

  1. Это правильный путь?
  2. Если так, то где я ошибаюсь синтаксически?

Я уверен, что это, вероятно, только начинающая боль, но я оглянулся вокруг и сначала не мог найти решение (у меня книга ASP.NET MVC на заказ - обещаю!)

Заранее спасибо за любую помощь!

Редактировать / Update:

Может ли это быть чем-то отличным между MVC 2 и 3? Например, из коробки, ActionResult Index () для HomeController.cs:

public ActionResult Index()
    {
        ViewModel.Message = "Welcome to ASP.NET MVC!";
        ViewModel.Title = "Home";

        return View();
    }

РЕДАКТИРОВАТЬ / ОБНОВИТЬ: Проблема найдена!

D'Oh! Я понял, что код работает, когда переменная установлена, но я пытался поэкспериментировать с неустановленной переменной (что, конечно, приводит к передаче нулевого значения вместо ложного).

Итак, теперь вопрос в том, какую логику я добавлю в _layout.cshtml, который позволит мне захватить ноль и установить вместо него значение false?

Я думаю что-то вроде:

@if(View.UseJQuery.IsNull()){ @View.UseJQuery = false; }

Однако есть несколько проблем с этим:

  • IsNull () - правильная функция или мой синтаксис неверен? (отсутствие синтаксической поддержки Razor в VS 2010 убивает меня, хаха)
  • Как установить переменную UseJQuery локально в макете? Я сомневаюсь, что View.UseJQuery будет работать, потому что это то, что устанавливает контроллер, верно?

Во всяком случае, я получаю сообщение об ошибке при попытке установить указанное выше значение «Недопустимый термин выражения '='», поэтому я считаю, что коллекция переменных ViewModel может быть доступна только для чтения представлению?

- Шон

Ответы [ 3 ]

1 голос
/ 21 октября 2010

Обычно я ожидаю увидеть что-то похожее на это:

public ActionResult Index()
{
    GalleryModel gm = new GalleryModel();

    var model = new ViewModel {
        UseJQuery = false,
        Title = "Image Gallery",
        Testy = gm.TestString            
    };

    return View(model);
}

Глядя на ваш код, ViewModel это класс или объект с большой буквы V? В любом случае, важный бит передает его методу View().

На странице просмотра вам нужно указать, что это представление строго типа, ожидая модель типа ViewModel.

Обычно вы наследуете от System.Web.Mvc.ViewPage<T>

1 голос
/ 21 октября 2010

Похоже, вы не передаете свою модель представлению._layout.cshtml настроен как строго типизированное представление, ожидающее объект ViewModel?

0 голосов
/ 22 октября 2010

в вашем контроллере вы определяете:

ViewModel.UseJQuery

но на ваш взгляд вы используете:

if(View.UseJQuery)
...