C# 如何从视图和关联的代码隐藏文件访问ViewModel?

C# 如何从视图和关联的代码隐藏文件访问ViewModel?,c#,asp.net,view,viewmodel,C#,Asp.net,View,Viewmodel,我是ASP.NET的真正初学者,在VisualStudio2010中使用MVC2+EF4 我正在尝试使用MVVM模式,并将我的视图强键入ViewModel <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="True" CodeBehind="~/Views/Options/Index.aspx.cs" Inherits="System.Web

我是ASP.NET的真正初学者,在VisualStudio2010中使用MVC2+EF4

我正在尝试使用MVVM模式,并将我的视图强键入ViewModel

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

我的选项视图模型如下所示:

 public class OptionsViewModel
{
    public List<DeskPreference> DeskPreferences { get; set; }
    public List<DayPreference> DayPreferences { get; set; }
}
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
}
}
公共类选项视图模型
{
公共列表首选项{get;set;}
公共列表日期首选项{get;set;}
}
在控制器中,我创建了一个新选项ViewModel和do return View(MyOptions ViewModel)

然后,例如,我想根据DayPreference中的内容选中/取消选中一些框。我不知道如何从我的代码隐藏文件访问模型,该文件如下所示:

 public class OptionsViewModel
{
    public List<DeskPreference> DeskPreferences { get; set; }
    public List<DayPreference> DayPreferences { get; set; }
}
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
}
}
使用System.Web.Mvc;
使用DeskRota_v1.ViewModels;
公共类选项页面:System.Web.Mvc.ViewPage
{
受保护的无效页面加载(对象发送方、事件参数e)
{   
设置复选框();
}
私有void设置复选框()
{           
foreach(Model.DayPreferences中的DayPreference)
{
\\这里的复选框
}
}

它会出现“名称‘Model’在当前上下文中不存在”。此外,如果我尝试在视图中执行此操作,则没有intellisense,我认为应该有。有人能解释一下我做错了什么吗?我应该如何访问ViewModel及其属性?

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

表单提交时将调用发布版本,并将您的viewmodel作为参数接受。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());
}

如果您使用的是asp.net mvc,则没有代码隐藏文件。整个模型不同。您似乎缺少一些关键概念。与其使用现有的概念,我建议您花几个小时查看基础知识,然后重新审视您的具体问题。此外,我建议改为使用mvc 3或4,因为语法更清晰在我看来。这里有一篇来自微软的介绍,让你从基础开始:除了上面的建议,我应该补充一点,你不需要MVVM,因为框架是围绕MVC模式构建的。你仍然可以在MVC中拥有一个视图模型。@Chad我读过这篇文章,它促使我尝试使用codebehind,以避免最终失败“凌乱”的观点。我当时的印象是,如果我愿意,我可以选择使用代码隐藏文件,这不对吗?@Josh感谢你的评论和链接-我以前看过这篇文章并浏览了一遍。我会回去更详细地关注它。如果有机会,你可以给我一些关于我遗漏了什么的建议感谢!我想在这个项目中至少使用MVC 3,但不幸的是这是不可能的…谢谢你的回答。我会接受,但我仍然对如何访问ViewModel中的属性感到困惑。我的ViewModel确实有几个构造函数,例如在我的控制器中,我有
选项ViewModel选项ViewModel=新选项ViewModel(桌面选项、日期选项);返回视图(选项ViewModel)
这是正确的吗?然后如何在视图中执行类似于
Model.DayPreferences
的操作?正确。返回视图时传递实例化的视图模型,如上所述。在视图中,需要声明视图使用的模型(@Model options viewmodel)然后,您想要使用模型中的某个值或方法的任何地方,只需将其放入您的视图中:(您的桌面选项:@model.DeskOptions)。将您的视图模型视为一种视图助手,它包含了视图在整个视图生命周期(从初始加载和绘制到表单提交,再到重新加载等)中完成其工作所需的所有信息和方法。这个答案和您的评论肯定让我站在了正确的立场上。我想我对我正在做的事情有更多的把握现在正在做。我认为最直接的问题是我试图从System.Web.Mvc.ViewPage继承…当我更改为Inherits=“mynamespace.Views.Options Page”时,它可以再次找到模型,而无需在视图中的任何其他位置声明它?无论如何,感谢您的帮助。