如何从 View 和关联的代码隐藏文件中访问我的 ViewModel?
Posted
技术标签:
【中文标题】如何从 View 和关联的代码隐藏文件中访问我的 ViewModel?【英文标题】:How can I access my ViewModel from the View and associated code behind file? 【发布时间】:2012-11-13 17:41:48 【问题描述】:我是 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
它出现“当前上下文中不存在名称‘模型’”。另外,如果我尝试做 在视图中没有智能感知,我认为应该有。有人可以解释我做错了什么吗?我应该如何访问 ViewModel 及其属性?
【问题讨论】:
如果您使用的是 asp.net mvc,则文件后面没有代码。整个模型是不同的。 您似乎遗漏了一些关键概念。我建议不要使用现有的东西,而是花几个小时查看基础知识,然后重新审视您的具体问题。另外,我建议使用 MVC 3 或 4,因为我认为语法更简洁。这是来自 Microsoft 的介绍,可帮助您入门:asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/… 除了上述建议之外,我应该补充一点,您不需要 MVVM,因为该框架是围绕 MVC 模式构建的。您仍然可以在 MVC 中拥有视图模型。 @Chad 我读过这篇文章,它促使我尝试使用代码隐藏来避免出现“混乱”的视图。 link 我的印象是,如果我愿意,我可以选择使用文件隐藏代码,这不正确吗? @Josh 感谢 cmets 和链接 - 我之前看过这篇文章并略过。我会回去更详细地跟踪它。如果有任何机会,您可以给我一些关于我所缺少的东西的指示,将不胜感激!我想为这个项目至少使用 MVC 3,但不幸的是这是不可能的...... 【参考方案1】:对于您需要回发的每个视图,您的控制器将为每个操作方法有两个重载:一个带有 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());
【讨论】:
感谢您的回答。我会接受,但我仍然对如何访问 ViewModel 中的属性感到困惑。我的 ViewModel 确实有几个构造函数,例如在我的控制器中我有OptionsViewModel optionsViewModel = new OptionsViewModel(deskOptions, dayOptions); return View(optionsViewModel);
这是正确的路线吗?然后我该如何在视图中执行Model.DayPreferences
之类的操作?
正确。像上面那样返回视图时传递实例化的视图模型。在您的视图中,您需要声明您的视图正在使用的模型(@model OptionsViewModel),然后在您想要使用模型中的值或方法之一的任何地方将其放入您的视图中:(您的桌面选项: @Model.DeskOptions)。将您的视图模型视为一种视图助手,它包含视图在整个视图的整个生命周期中完成其工作所需的所有信息和方法,从初始加载和绘制,到表单提交,再到重新加载等。
这个答案和你的 cmets 肯定让我走在了正确的道路上。我想我对我现在正在做的事情有了更多的把握。我认为直接的问题是我试图从 System.Web.Mvc.ViewPage以上是关于如何从 View 和关联的代码隐藏文件中访问我的 ViewModel?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 MasterPage 的代码隐藏中访问 TextArea