2016-12-05 174 views
0

新手在這裏。請求網址/event/details/3時,我收到錯誤The resource cannot be found.。 我使用MVVM。ASP.Net MVC5 - 「資源無法找到」錯誤

我的模式很簡單。我有「事件」,「人」和「PersonInEvent」表。 「PersonInEvent」是另外兩個(持有外鍵)的聯結表。

我試圖在「詳細信息」視圖中顯示其ID爲(/event/details/3)的事件數據。該事件的ID傳遞給「Details」控制器動作,它實例化了我的ViewModel,它包含一個事件對象。我將此事件設置爲具有創建視圖模型時收到的標識的事件。

根據我的控制器(見下文),我得到的錯誤,因爲vm.Event == null。但我找不到解決此問題的方法。我感覺這是一個基本的編程問題,比如我的viewmodel中的「Event」屬性是如何創建的。但我仍然無法弄清楚解決方案。提前致謝。

我的控制器的詳細動作:

[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]那我忘了刪除acti上。

+2

的'Details'方法只以上被當窗體發佈,因爲該屬性,稱爲[HttpPost] 。你是否也有一個'Details'方法使用屬性[HttpGet]?如果是這樣,請在您的問題中包含該代碼。 –

+0

@Peter B這就是它的確...我試圖通過post方法發送id,並且我忘記刪除屬性。 –

+1

注意,這不是MVVM,它是MVC。這就是爲什麼它被稱爲aspnet * MVC *。 – Will

回答

3

這是一種糟糕的方式MVC是一種模式,它是自我。 ViewModels不應直接引用數據庫。但是,問題在於,在你的viewModel中,你已經聲明瞭一個私人的事件對象。在構造函數中,您正嘗試設置此對象的標識而不先實例化一個新實例。

,因爲它沒有做任何有用的構造反正你可以刪除這行代碼:

_event.EventId = id; 
+0

謝謝bilpor。問題在於Peter在評論中告訴我的_HttpPost_屬性。你提到的這一行也會拋出一個錯誤,一旦我刪除它就會消失。 「_ViewModels不應該直接引用數據庫_」,所以我應該在我的控制器中填充視圖模型屬性,並在該控制器中構建邏輯是你的意思? –

+1

是的,MVC的重點在於它的名稱Model-View-Controller。控制器應儘可能輕,查看這些控制器的最佳方式是將數據傳遞到服務層和數據層的切換機制。 viewModels應該定義視圖需要顯示的數據。在這裏有構造函數是好的,但它們是從控制器分配的。 (查看關注分離),SOLID原則和DRY。始終用這些標準進行編碼,而且你不會犯太多錯誤。還要考慮'防禦性'編碼。如果它可以被打破,有人會打破它。 – bilpor