簡體   English   中英

MVC手動序列化復雜對象或模型綁定

[英]MVC manually serializing complex object or model binding

我在MVC中遇到的最大問題之一是當我將復雜屬性(視圖模型)附加到我的模型以在表單上使用時。 例如,我有一個名為Customer.cs的模型。 該客戶(為簡單起見)隨時有1個訂單。 所以我給他一個Customer.Order的財產。 客戶有許多其他屬性將他定義為獨特的客戶。 Order屬性本身具有一組唯一屬性。 所以我正在努力,構建我的Controller,其他模型值,最后我開始計算我的View詳細信息。
我首先定義表單本身。

@using (Html.BeginForm("Customer", "Home", FormMethod.Post, new { @id = "customerForm" })

此表單聲明基本上告訴View,當用戶單擊Submit時,此表單中的所有內容都應序列化並發送到Controller。 首先,我為我的主要模型Customer.cshtml創建一個視圖。 它接受Customer.cs模型。

我專門為我創建的這個名為Order.cshtml的復雜對象創建了一個View。 它接受一個Order.cs模型(所以我可以稍后在其他父模型上重用它,比如Invoice因為我很聰明並且提前考慮。)所以我寫了所有這些javascript和視圖邏輯,這取決於視圖獨立並可與其他模型重復使用。 我的textboxfor聲明看起來像這樣:

@Html.TextBoxFor(m => m. OrderDate) 

當我點擊提交時,我注意到的第一件事是Order對象中沒有任何值被回發。 所以我坐在那里進行調試,需要一段時間,但我終於弄清楚這不會這樣。 除非有單獨序列化視圖模型的方法,然后將其附加到父模型,即使這樣你也必須編寫一堆Javascript來手動覆蓋默認表單提交過程,以及您可能正在制作的任何其他模型提交用於客戶端字段驗證。
我認為應該有一種更簡單的方法來處理這個問題。 我知道解決這個問題的方法,但它並不漂亮。 您可以為Order.cs創建視圖,以取代Customer.cs模型。 然后,使用textboxfor聲明,如下所示:

@Html.TextBoxFor(m => m.Order.OrderDate) 

定義View上的所有屬性。 這將使用默認綁定,一切都很好。 除了我用JavaScript編寫的代碼怎么樣? 我必須通過並將“Order_”附加到表單上列出的所有ID的引用。 此外,現在不能在模型之間輕松移動,每次創建使用Order對象的新模型時,我都必須重新創建此View,因為它現在接受Customer.cs模型。 我還必須重寫javascript,或者想出一些傳遞前綴(ViewData)的奇特方式。 這似乎不正確。 我究竟做錯了什么?

如果為使用Order的所有視圖模型創建接口,該怎么辦?

interface IWithOrder
{
    Order Order { get; set; }
}

在常用的Order視圖中使用此界面:

@model Project.ViewModels.IWithOrder
...
@Html.TextBoxFor(m => m.Order.OrderDate, new { Id = "OrderDate" }) 

如果是Customer,您可以創建Customer視圖模型,該模型派生自IWithOrder:

public class CustomerViewModel : IWithOrder
{
    public Order Order { get; set; }

    public Customer Customer { get; set; }
}

現在您可以重用Order視圖,但您的視圖模型需要從IWithOrder派生。

您還可以設置在HTML元素的ID htmlAttributes的參數TextBoxFor如果你不想追加Order_在JS引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM