【发布时间】:2016-12-05 22:47:20
【问题描述】:
这里是新手。我在请求 url /event/details/3 时收到错误 The resource cannot be found.。
我使用 MVVM。
我的架构很简单。我有“Event”、“Person”和“PersonInEvent”表。 “PersonInEvent”是另外两个的联结表(保存外键)。
我正在尝试在“详细信息”视图中显示事件数据及其 id (/event/details/3)。事件的 id 被传递给“详细信息”控制器操作,该操作会实例化包含事件对象的 ViewModel。我将此事件设置为具有创建视图模型时收到的 id 的事件。
根据我的控制器(见下文),我收到错误是因为vm.Event == null。但我找不到解决这个问题的方法。我觉得这是一个基本的编程问题,例如我的视图模型中的“事件”属性是如何创建的。但我仍然无法弄清楚解决方案。提前致谢。
我的控制器的详细信息操作:
[HttpPost] // this was the problem
[ValidateAntiForgeryToken]
public ActionResult Details(int id)
{
var vm = new EventDetailsViewModel(id);
if (vm.Event == null)
{
return HttpNotFound(); // I get the error because of this imo
}
return View("Details", vm);
}
我的视图模型:
public class EventDetailsViewModel
{
private readonly ApplicationDbContext _db = new ApplicationDbContext();
private readonly int _eventIdVm;
private Event _event;
public EventDetailsViewModel(int id)
{
_eventIdVm = id;
_event.EventId = id;
}
public Event Event
{
get
{
return _event = _db.Event.Find(_eventIdVm);
}
set { _event = value; }
}
public List<Person> Persons
{
get
{
if (!_db.PersonInEvent.Any(pe => pe.EventId == _eventIdVm))
{
return Enumerable.Empty<Person>().ToList();
}
var personsOfEvent = _db.PersonInEvent.Where(pe => pe.EventId == _eventIdVm)
.Select(pe => pe.Person)
.ToList();
return personsOfEvent;
}
}
}
我的看法以防万一:
@model BillSplittingWebApp.ViewModels.EventDetailsViewModel
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
<h4>Event</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.Event.EventName)
</dt>
<dd>
@Html.DisplayFor(model => model.Event.EventName)
</dd>
<dt>
@Html.DisplayNameFor(model => model.Event.EvenTimeBegin)
</dt>
<dd>
@Html.DisplayFor(model => model.Event.EvenTimeBegin)
</dd>
</dl>
</div>
编辑:问题是我忘记删除该操作的属性[HttpPost]。
【问题讨论】:
-
上面的
Details方法只在表单发布时被调用,因为属性[HttpPost]。您是否还有使用属性 [HttpGet] 的Details方法?如果是这样,请在您的问题中也包含该代码。 -
@Peter B 确实是这样......我之前尝试通过 post 方法发送 id,但我忘了删除属性。
-
旁注,这不是 MVVM,它是 MVC。这就是为什么它被称为 aspnet MVC。
标签: c# asp.net asp.net-mvc asp.net-mvc-5