这是我的简单控制器,它依赖于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个控制器和相应的视图,那么我将不得不一遍又一遍地编写相同的代码。
如何减少此代码重复。我已经在使用视图模型了。如何解决这个问题。我不想在这里使用存储库模式。