2010-07-28 97 views
1

我沒有在我的MVC應用程序中使用「模型綁定」 - 也就是說,我沒有嘗試過將表單輸入映射到Action參數列表中的一個或多個類,在許多地方描述的方式。相反,我只是發送每個單獨的表單字段的參數,或使用FormCollection。MVC模型綁定混淆

我在想我可能會嘗試這個,但我對基本前提感到困惑。看起來這個想法是,你使用相同的模型來進行ViewModel(從Controller到View)的「綁定」(從View到Controller)。 (我爲每個視圖使用強類型視圖和單獨的ViewModel。)

但是,我發現我的View的需求與我的Action的需求完全不同 - 例如,視圖可能需要用戶可以從中選擇幾個SelectLists。但是,Action只需要知道用戶選擇了哪些項目,而不是每個列表中的所有選項。

真的習慣使用同一個班同時進行兩個方向嗎?

例如,這裏是我的ViewModel類之一:

public class IntervieweeSelectLists 
{ 
    public SelectList intervieweesList { get; set; }    
    public ClientSelectLists districtFilterLists { get; set; } 
    public SchoolDisplayListInfo schoolListDisplay { get; set; } 
    public long selectedIntervieweeID { get; set; }    
    public string selectedIntervieweeName { get; set; }   
    public string selectedSiteID { get; set; }     
    public bool needsInterviewList { get; set; }     
    public bool needsClientSelectLists { get; set; }   
} 

(再加上有一些方法等)

通過查看需要的這個類,但並非所有的它是需要的行動 - 即,intervieweesList,districtFilterLists,needsInviewview等

我想我的問題是:如果我要寫一個自定義模型綁定器綁定此類,我將不得不重新創建整個類模型聯編程序,包括SelectLists,內容其中來自數據庫,當我真正需要的是用戶選擇的東西?或者我會設置這個類的現有實例中的所有值,從View中發送到模型聯編程序?

對不起,如果這是不連貫的......我的理解在這裏丟失了一些東西。幫幫我! :)

回答

1

我只會重新創建那些在模型活頁夾上有意義的屬性。必須從數據庫填充SelectListItems是一個巨大的開銷,如果屬性值不會用於(通常發生)您的操作,除非服務器端出現一些錯誤,在這種情況下,您需要重新創建整個ViewModel - 顯示視圖。

1

您不需要自定義模型活頁夾。當您在控制器操作中返回IntervieweeSelectLists時,您的列表將爲空,因爲從帖子傳回的數據不會包含該信息。所以你有一個對象,它有空列表所需的答案。現在讓我們說一些事情沒有驗證,你需要再次顯示所有的列表。那麼控制器動作知道何時將顯示此模型,以便只在模型傳遞到視圖中時才需要填充列表。如果您不需要將模型傳遞到視圖中,並僅存儲結果,因爲不需要填充列表。

+0

那麼,我正在考慮自定義模型綁定器的原因是,當我嘗試將上述類放入Action的參數列表中時,即使Model.IsValid爲空,所有字段都返回null(或默認值)真正。它看起來像是默認的模型綁定器無法解決它。但可能是因爲我沒有遵循字段的正確命名約定。 – Cynthia 2010-07-28 15:53:52

+0

好的,當我嘗試更改HTML字段名稱以匹配類中的內容時,我正在獲取值(進度!)。然而,返回的一些字段被埋在類的較低層中 - 即,所選區屬性在區域過濾列表對象內。它根本沒有選擇 - districtFilterLists爲空。所以我想我需要一個自定義模型構建器 - 或者徹底改變我的ViewModel類。但是,謝謝,我覺得我終於到了某個地方。我沒有同事 - 我是整個IT部門。 - 所以我需要有人來反彈創意。 – Cynthia 2010-07-28 16:09:07

+0

聽起來像您正在手動編寫您的HTML。您應該使用DisplayFor和EditFor html幫助程序爲您創建html。他們會自動爲您創建名稱。我強烈建議在http://www.asp.net上檢查ASP.Net MVC演示。 (Model.IsValid只是驗證,如果你沒有驗證數據註釋,那麼該屬性默認是有效的) – 2010-07-28 18:39:38