【问题标题】:ASP.Net MVC5 – "Resource Cannot be found" errorASP.Net MVC5 –“找不到资源”错误
【发布时间】: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


【解决方案1】:

这是一种糟糕的方式,MVC 是一种模式,它是自身的。 ViewModel 不应该直接引用数据库。但是,问题是在您的 viewModel 中您已经声明了一个私有事件对象。在构造函数中,您尝试设置此对象的 id,而无需先实例化一个新实例。

您可以删除这行代码,因为它在构造函数中没有做任何有用的事情:

 _event.EventId = id;

【讨论】:

  • 谢谢比尔波尔。正如彼得在评论中所说,问题是我的 HttpPost 属性。你提到的那行也抛出了一个错误,一旦我删除它就消失了。 “ViewModels 不应该直接引用数据库”所以我应该在我的控制器中填充视图模型属性并在该控制器中构建逻辑是你的意思吗?
  • 是的,MVC 的重点在于它的名称 Model-View-Controller。控制器应该尽可能轻巧,最好的方法是将数据传递到服务层和数据层的切换机制。 viewModels 应该定义视图需要显示的数据。在这里有构造函数很好,但它们是从控制器分配的。 (查找关注点分离)、SOLID 原则和 DRY。始终牢记这些编码,您不会出错。还要考虑“防御性”编码。如果它可以被打破,就会有人打破它。
猜你喜欢
  • 2012-03-06
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
相关资源
最近更新 更多