我是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及其属性?
答案 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());
}