Как я могу запустить код из моего файла макета?

Я использовал следующий учебник, чтобы помочь мне создать RSS Reader в моем приложении ASP.NET MVC3 Razor:

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 Reader работать с обоими представлениями, у меня есть следующий код в моем 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 Reader в код главной страницы позади, и он автоматически работал бы на каждой странице.

Есть ли контроллер для страниц макета, который позволяет мне делать то же самое?

Как я могу заставить это работать при каждом вызове страницы макета, ничего не возвращая?


EDIT: Следуя совету @Sebastian, я добавил этот код в частичное представление, удалил CT.Models.RssReader.GetRssFeed() из return View() и включил это в свой файл макета:

 @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)


person Curt    schedule 14.03.2012    source источник


Ответы (2)


Вы должны создать частичное представление и добавить туда функциональность. Затем в макете визуализируйте этот фрагмент.

ИЗМЕНИТЬ

Является ли ваше частичное представление действительно частичным представлением? Причина, по которой я это сказал, заключается в том, что у вас есть «_» перед именем, что предполагает, что это может быть макет (может быть, просто соглашение об именах).

Чтобы исправить ошибку ссылки на объект, вы должны добавить объявление @Model поверх вашего частичного представления.

Надеюсь, поможет.

ОБНОВЛЕНИЕ Чтобы использовать другую модель в частичном представлении, вам необходимо явно указать, какую модель вы собираетесь использовать в частичном методе рендеринга.

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

Дайте мне знать, если это решило вашу проблему.

person Sebastian Siek    schedule 14.03.2012
comment
Спасибо за вашу помощь, но теперь я получаю другую ошибку. Пожалуйста, смотрите редактирование в моем вопросе - person Curt; 15.03.2012
comment
Ах, тогда это просто мое плохое соглашение об именах, я видел учебник, в котором использовались символы подчеркивания для частичных представлений, и скопировал его. У меня есть @model IEnumerable<CT.Models.Rss> в верхней строке моего частичного представления, но я все еще получаю ту же ошибку. - person Curt; 15.03.2012
comment
да, извините - моя вина. ваше соглашение об именах правильное. Я пытаюсь воспроизвести это сейчас и скоро свяжусь с вами - person Sebastian Siek; 15.03.2012

Новая ошибка, с которой вы столкнулись, связана с тем, что вы не передаете модель в частичное представление. Вы можете сделать это со вторым аргументом функции 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
   }
}

Надеюсь, что все имеет смысл

person musefan    schedule 15.03.2012