减少控制器中的代码重复

时间:2015-12-09 10:58:40

标签: asp.net-mvc controller viewmodel asp.net-mvc-viewmodel

这是我的简单控制器,它依赖于EventsViewModel。获取必填字段后,我将比较返回的数据并将其填充到两个变量中,最后将UpcomingPassedEventViewModel返回到视图页面。

      public ActionResult Event()
      {
        int currentUserId = this.User.Identity.GetUserId<int>();
        var events = this.db.Events
            .Where(e => e.AuthorId == currentUserId)
            .OrderBy(e => e.StartDateTime)
            .Select(e => new EventsViewModel()
             {
               Title = e.Title,
               StartDateTime = e.StartDateTime,
               Name = e.ApplicationUser.UserName
            });
        var upcomingEvents = events.Where(e => e.StartDateTime > DateTime.Now);
        var passedEvents = events.Where(e => e.StartDateTime <= DateTime.Now);
        return View(new UpcomingPassedEventViewModel()
        {
            UpcomingEvents = upcomingEvents,
            PassedEvents = passedEvents
        });
    }

现在,我有一个部分视图_Events像这样:

     @model App.Models.UpcomingPassedEventViewModel

    <div class="row">
     @if (Model.UpcomingEvents.Any()) {
      @Html.DisplayFor(x => x.UpcomingEvents) }
    else {
     <div class="col-md-4 col-sm-6 col-xs-12">No events</div> }
   </div>

我可以在事件控制器中的事件视图页面上呈现此部分视图,对应于事件控制器中的事件操作方法,如下所示:

     @{ Html.RenderPartial("_Events"); }

如果我尝试在其他地方渲染它,它将抛出System.NullReferenceException:对象引用未设置为对象的实例。这行错误--- @ if(Model.UpcomingEvents.Any()) 问题是:

1&gt;如果我想在家庭控制器的索引视图上呈现相同的局部视图,那么我也必须在索引方法中编写完整的代码。

2 - ;如果我这样做,那么代码重复问题。假设我有10个控制器和相应的视图,那么我将不得不一遍又一遍地编写相同的代码。

如何减少此代码重复。我已经在使用视图模型了。如何解决这个问题。我不想在这里使用存储库模式。

0 个答案:

没有答案