【问题标题】:ASP.NET MVC: logic in _layout.cshtml that takes variables from a given controllerASP.NET MVC:_layout.cshtml 中从给定控制器获取变量的逻辑
【发布时间】:2011-04-28 08:02:08
【问题描述】:

对 MVC 不熟悉,所以如果术语有点不对,请见谅。

我正在使用 ASP.NET MVC3 beta 和 VS 2010。

我不确定这是概念错误、语法错误还是什么错误。

基本上,我想做的是,对于 _layout.cshtml,我想为 ActionResult 将 ViewModel.UseJQuery 设置为 true 的任何控制器包含 jQuery 脚本。

我是新手,所以我可能是错的,但看起来最好的方法(我目前正在尝试的)是:

_layout.cshtml 文件

 @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();
        }

但是,这给了我一个关于必须将 null 转换为布尔值的错误(我假设它没有找到 UseJQuery 标志)。

所以,我的问题有两个:

  1. 这是解决此问题的正确方法吗?
  2. 如果是这样,我在语法上哪里出错了?

我确定这可能只是初学者的痛苦,但我环顾四周,一开始找不到解决方案(我有一本 ASP.NET MVC 书正在订购——承诺!)

提前感谢您的帮助!

编辑/更新:

这在 MVC 2 和 3 之间可能会有所不同吗?例如,开箱即用 HomeController.cs 的 Index() ActionResult 为:

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

        return View();
    }

编辑/更新:发现问题!

天啊!我意识到在设置变量时代码可以工作,但我一直在尝试使用未设置的变量(这当然会导致传递空值而不是 false)。

那么,现在的问题是,我应该在 _layout.cshtml 中添加什么逻辑,以允许我捕获 null 并将其设置为 false?

我的想法是这样的:

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

但是,这里有一些问题:

  • IsNull() 是正确的函数,还是我的语法错误? (在 VS 2010 中缺少对 Razor 的语法支持快要死了,哈哈)
  • 如何在布局中本地设置 UseJQuery 变量?我怀疑 View.UseJQuery 会起作用,因为这是控制器设置的东西,对吧?

无论如何,我试图设置上述值的错误是“无效的表达式术语'='”,所以我相信 ViewModel 变量集合可能对 View 是只读的?

-- 肖恩

【问题讨论】:

    标签: c# visual-studio-2010 razor asp.net-mvc-3


    【解决方案1】:

    您似乎没有将模型传递给视图。 _layout.cshtml 是否设置为期望 ViewModel 对象的强类型视图?

    【讨论】:

    • 这是一个直接开箱即用的设置,MV3 应用程序在一个全新的解决方案中。 _layout.cshtml 是 VS 为我生成的。
    • 啊哈,我看到这确实是 MVC3 的差异 - 请参阅 weblogs.asp.net/scottgu/archive/2010/07/27/… 中的“新动态 ViewModel 属性” - 话虽如此,我尝试了您问题中的代码,并且一切都按预期工作?没有错误,它根据 UseJQuery 标志提供或不提供脚本。你能把你的确切错误复制进去吗?
    • 感谢您的跟进!我正在打开我的笔记本电脑以给出完整的答案,但我相信它说它无法将 UseJQuery 从“null”转换为“bool”,这让我认为该值没有被传递(我检查了拼写,等等。)。我想知道我试图为 _layout.cshtml 而不是实际视图做这件事是否可能是一个问题?我想要继承的逻辑。也许我需要在 _layout.cshtml 中将其设置为 false,并在必要时让 Controller 将其覆盖为 true?感谢您的持续帮助。 :)
    • 啊哈!现在开始更有意义了。不幸的是,我从未使用过dynamic,老实说,我从不想使用,所以我不确定您如何检查它是否包含某个名称的属性。您可以使用 try/catch 块来捕获 RuntimeBinderException,或者如果不需要,您可以始终将其设置为 false,而不是让它未定义。如果有更优雅的解决方案,快速谷歌并没有帮助我找到它。
    【解决方案2】:

    通常我希望看到类似这样的内容:

    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&lt;T&gt; 继承

    【讨论】:

    • 请查看编辑/更新——这是 MVC v2 与 v3 的问题吗?
    • 请查看我更新的帖子以进一步描述问题所在。谢谢!
    【解决方案3】:

    在您的控制器中定义:

    ViewModel.UseJQuery
    

    但在您看来,您使用的是:

    if(View.UseJQuery)
    

    【讨论】:

    • 正确。但是,我要说明的是,这是在布局页面中。因此,某些控制器可能不会考虑定义这个值,导致它为 null,从而导致抛出错误,因为它无法将“null”转换为“boolean”。
    • 那么,我想说的是:如果 View.UseJQuery = null,请将 View.JQuery 设置为 false。稍后在代码中,我们使用 if(View.UseJQuery) 代码。所以,问题是——值 View.UseJQuery 已被传递给 _layout.cshtml;如果它为空,我如何修改该值以便将其设置为 false?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多