ここの初心者です。 /イベント/詳細/ 3をリクエストするとエラーThe resource cannot be found.
が表示されます。 私はMVVMを使用しています。ASP.Net MVC5 - "リソースが見つかりません"というエラー
スキーマは単純です。私は "イベント"、 "人"と "PersonInEvent"テーブルがあります。 "PersonInEvent"は、他の2つ(外部キーを保持する)のジャンクションテーブルです。
「詳細」ビューに、そのID(/イベント/詳細/ 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>
EDIT:問題だった属性[HttpPost]
こと私はactiのために削除するのを忘れましたに。
をフォームがポストされたときにのみ、[HttpPost]理由属性を、呼び出される上記 'Details'方法。属性[HttpGet]を使用する 'Details'メソッドもありますか?もしそうなら、そのコードもあなたの質問に含めてください。 –
@Peter Bそれは確かにそれでした...私はidメソッドを以前に送信しようとしましたが、属性を削除するのを忘れました。 –
サイドノート、これはMVVMではなく、MVCです。それがaspnet * MVC *と呼ばれる理由です。 – Will