如何从View和相关代码隐藏文件中访问我的ViewModel?

时间:2012-11-13 17:41:49

标签: c# asp.net view viewmodel

我是ASP.NET的初学者,在Visual Studio 2010中使用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
}
}

它出现了“名称'模型'在当前上下文中不存在”。如果我尝试做&lt;%Model。 %GT;在视图中没有intellisense,我认为应该有。有人可以解释一下我做错了什么吗?我该如何访问ViewModel及其属性?

1 个答案:

答案 0 :(得分:0)

对于您需要回发的每个视图,您的控制器将对每个操作方法都有两个重载:一个具有HttpGet签名,另一个具有HttpPost签名。将在第一次加载页面时调用GET版本,并将设置初始页面值。

将在表单提交时调用POST版本,并将您的viewmodel作为arg接受。 MVC将使用您在表单中发布的值自动重建它(假设您使用的是相对简单的类型。更复杂的类型是可行但更复杂的。)

我自己的约定是在ViewModel中有一个工作单元,负责持久化或以其他方式处理提交的值。不要把这类东西放在控制器中。

您的viewmodel将需要一个无参数构造函数,这是MVC在页面提交时重构它时将使用的版本。一般来说,我还有一个我在GET版本上使用的第二个构造函数,以便VM可以实例化它的初始值。

[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());
}