【问题标题】:How can I run code from my layout file?如何从我的布局文件运行代码?
【发布时间】:2012-03-14 18:46:38
【问题描述】:

我使用以下教程帮助我在我的 ASP.NET MVC3 Razor 应用程序中构建了一个 RSS 阅读器:

http://weblogs.asp.net/jalpeshpvadgama/archive/2011/08/17/creating-basic-rss-reader-in-asp-net-mvc-3.aspx

但是,与教程示例不同,我希望 RSS 提要显示在每个页面上,因此已将其添加到我的布局文件 /Views/Shared/_Layout.cshtml

我目前在我的网站上只有 2 个视图,为了让 RSS 阅读器在这两个视图上工作,我在我的 HomeController 中有以下代码:

    public class HomeController : Controller
    {
        //
        // GET: /Index/

        public ActionResult Index()
        {
            return View(CT.Models.RssReader.GetRssFeed());
        }

        public ActionResult About()
        {
            return View(CT.Models.RssReader.GetRssFeed());
        }

    }

根据我的 WebForms 经验,我只需在我的母版页代码中添加 RSS 阅读器代码,它就会自动在每个页面上运行。

是否有一个用于布局页面的控制器允许我做同样的事情?

我怎样才能让它在布局页面的每次调用中都能正常工作,而无需返回任何内容?


编辑:按照@Sebastian 的建议,我现在将此代码添加到部分视图中,从return View() 中删除CT.Models.RssReader.GetRssFeed() 并将其包含在我的布局文件中:

 @Html.Partial("_MyPartialView")

这个局部视图中的代码是:

<ul>
    @foreach (var item in Model)
    {
      <li>
         <a href="@item.Link" target="_blank">@item.Title</a>
      </li>
    }
</ul>

但是,我没有收到运行时错误:

对象引用未设置为对象的实例。

@foreach (var item in Model)在线出错

【问题讨论】:

    标签: asp.net asp.net-mvc-3 razor


    【解决方案1】:

    您必须创建局部视图并在其中添加功能。 然后在你的布局中,渲染这个部分。

    编辑

    你的部分观点真的是部分观点吗?我之所以这么说是因为您在名称前面有“_”,这表明它可能是一个布局(可能只是一个命名约定)。

    要修复对象引用错误,您必须在局部视图顶部添加@Model 声明。

    希望对你有帮助。

    更新 为了在局部视图中使用不同的模型,您需要在渲染局部方法上明确声明要使用的模型。

    @{Html.RenderPartial("../YourFeed", Model.YourFeedModel);}
    

    如果这解决了您的问题,请告诉我。

    【讨论】:

    • 为您的帮助干杯,但我现在又遇到了另一个错误。请查看我的问题中的编辑
    • 啊,那只是我糟糕的约定命名,我看到了一个使用下划线表示部分视图的教程并复制了它。我的部分视图顶部有@model IEnumerable&lt;CT.Models.Rss&gt;,但我仍然遇到同样的错误。
    • 是的,对不起-我的错。您的命名约定是正确的。我正在尝试复制它,并会尽快回复您
    【解决方案2】:

    您遇到的新错误是由于您没有将模型传递给局部视图。您可以使用 Html.Partial 函数的第二个参数来执行此操作...

    Html.Partial("ViewName", MyModel);
    

    我认为您正在尝试在布局页面中执行此操作,您也可以考虑使用静态引用来获取您的 RSS 提要。所以忘记需要传入一个模型和你的部分拥有:

    @foreach (var item in RssRepository.GetFeed())
    {
      <li>
         <a href="@item.Link" target="_blank">@item.Title</a>
      </li>
    }
    

    这就像一个类……

    public static RssRepository
    {
       public static MyModel GetFeed()
       {
          return new MyModel();//<- return what you would normally pass as a Model for RSS feeds
       }
    }
    

    希望一切都有意义

    【讨论】:

      猜你喜欢
      • 2012-03-29
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多