1

我是 ASP.NET 的真正初学者,在 Visual Studio 2010 中使用 MVC2 + EF4。

我正在尝试使用 MVVM 模式并将我的视图强输入到视图模型中。

<%@ 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
}
}

它提出“当前上下文中不存在名称'模型'”。另外,如果我尝试做 <% Model. %> 在视图中没有智能感知,我认为应该有。有人可以解释我做错了什么吗?我应该如何访问 ViewModel 及其属性?

4

1 回答 1

0

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

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

我自己的约定是在 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());
}
于 2012-11-13T18:11:53.463 回答