1

私はASP.NETの真の初心者であり、VisualStudio2010でMVC2+EF4を使用しています。

MVVMパターンを使用して、ViewをViewModelに強く入力しようとしています。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"        AutoEventWireup="True" CodeBehind="~/Views/Options/Index.aspx.cs" Inherits="System.Web.Mvc.ViewPage<OptionsViewModel>" %>

私のOptionsViewModelは次のようになります。

 public class OptionsViewModel
{
    public List<DeskPreference> DeskPreferences { get; set; }
    public List<DayPreference> DayPreferences { get; set; }
}

コントローラで、新しいOptionsViewModelを作成し、View(myOptionsViewModel);を返します。

次に、たとえば、DayPreferenceの内容に基づいていくつかのボックスをオン/オフにします。コードビハインドファイルからモデルにアクセスする方法がわかりません。これは次のようになります。

using System.Web.Mvc;
using DeskRota_v1.ViewModels;

public class OptionsPage : System.Web.Mvc.ViewPage<OptionsViewModel>
{
    protected void Page_Load(object sender, EventArgs e)
    {   
        setCheckBoxes();
    }

    private void setCheckBoxes()
    {           
        foreach (DayPreference dayPreference in Model.DayPreferences)
        {
\\ check boxes here
}
}

「「モデル」という名前は現在のコンテキストには存在しません」という名前が表示されます。また、<%モデルを実行しようとすると。%>ビューには、あるべきだと思っていたインテリセンスはありません。誰かが私が間違っていることを説明してもらえますか?ViewModelとそのプロパティにアクセスするにはどうすればよいですか?

4

1 に答える 1

0

コントローラには、ポストバックする必要のあるビューごとに、各アクションメソッドの2つのオーバーロードがあります。1つはHttpGet署名を使用し、もう1つはHttpPost署名を使用します。GETバージョンは、ページの最初のロード時に呼び出され、ページの初期値を設定します。

POSTバージョンはフォーム送信時に呼び出され、ビューモデルを引数として受け入れます。MVCは、フォームに投稿された値を使用して自動的に再構築します(比較的単純な型を使用していると仮定します。より複雑な型は実行可能ですが、より複雑です)。

私自身の慣例では、送信された値を永続化または処理する作業ユニットをViewModelに配置します。このようなものをコントローラーに入れないでください。

ビューモデルにはパラメーターなしのコンストラクターが必要です。これは、ページ送信時にMVCが再構成するときに使用するバージョンです。一般に、VMが初期値をインスタンス化できるように、GETバージョンで使用する2番目のコンストラクターもあります。

[HttpGet]
public ActionResult Index(int somethingICareAbout)
{
  return View(new IndexViewModel(somethingICareAbout));
}

[HttpPost]
public ActionResult Index(IndexViewModel viewModel)
{
  viewModel.SaveChanges()/DoWork()/Whatever();
  return View(new viewModel());
}
于 2012-11-13T18:11:53.463 に答える