2012-11-13 18 views
1

我是一名真正的ASP.NET初學者,並且在Visual Studio 2010中使用MVC2 + EF4。如何從視圖和關聯的代碼背後的文件訪問我的ViewModel?

我試圖使用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>" %> 

我OptionsViewModel看起來是這樣的:

public class OptionsViewModel 
{ 
    public List<DeskPreference> DeskPreferences { get; set; } 
    public List<DayPreference> DayPreferences { get; set; } 
} 

在我創建一個新的OptionsViewModel,做返回查看(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 
} 
} 

它與「名稱‘模式’在目前情況下不存在」出現。另外如果我嘗試做<%模型。 %>在視圖中沒有intellisense,我認爲應該有。有人能解釋我做錯了什麼嗎?我該如何訪問ViewModel及其屬性?

+1

如果您使用的是asp.net mvc,則文件後面沒有代碼。整個模型是不同的。 –

+1

你似乎錯過了一些關鍵概念。我會建議花費幾個小時來查看基礎知識,然後重新審視您的具體問題,而不是與您的工作一起工作。另外我會推薦使用MVC 3或4,因爲在我看來語法更清晰。這裏有一個來自微軟的介紹,讓你開始瞭解基礎知識: http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/intro-to-aspnet-mvc-3 – Josh

+0

除了上述建議之外,我還要補充一點,您不需要MVVM,因爲框架是圍繞MVC模式構建的。您仍然可以在MVC中使用視圖模型。 –

回答

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

謝謝你的回答。我會接受,但我仍然對如何訪問ViewModel中的屬性感到困惑。我有我的ViewModel的幾個構造函數,例如在我的控制器我有'OptionsViewModel optionsViewModel = new OptionsViewModel(deskOptions,dayOptions); return View(optionsViewModel);'這是否正確?那麼我如何在視圖中執行類似'Model.DayPreferences'的操作? – SWilliams

+0

正確。像上面那樣返回視圖時,傳遞實例化的視圖模型。在你看來,你需要聲明你的視圖使用的模型(@model OptionsViewModel),然後在你想要使用模型中的某個值或方法的任何地方簡單地將它放入你的視圖中:(Your Desk Options: @Model .DeskOptions)。把你的視圖模型看作一種視圖助手,它包含視圖需要在視圖的整個生命週期中完成工作的所有信息和方法,從初始加載和繪製到表單提交,重新加載等。 – Heather

+0

這個答案和你的評論肯定會讓我走上正確的路線。我認爲我現在有更多的處理我在做什麼。我認爲當前的問題是我試圖從System.Web.Mvc.ViewPage繼承 ...當我更改爲Inherits =「mynamespace.Views.OptionsPage」時,它可以再次找到該模型,而無需另外聲明它在視圖中?無論如何感謝您的幫助。 – SWilliams

相關問題