javascript - MVC 手动序列化复杂对象或模型绑定(bind)

标签 javascript c# asp.net-mvc asp.net-mvc-3

我在 MVC 中遇到的最大问题之一是当我将复杂属性( View 模型)附加到我的模型以用于表单时。例如,我有一个名为 Customer.cs 的模型。该客户(为简单起见)随时有 1 个订单。所以我给他一个 Customer.Order 的属性。客户有许多其他属性将他定义为一个独特的客户。 Order 属性本身有一组独特的属性。所以我继续前进,构建我的 Controller 和其他模型值,最后我开始计算我的 View 详细信息。
我首先定义表单本身。

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

这个表单声明基本上告诉 View ,当用户点击提交时,这个表单中的所有内容都应该被序列化并发送给 Controller 。 首先,我为我的主模型 Customer.cshtml 创建了一个 View 。它采用 Customer.cs 模型。

我专门为这个名为 Order.cshtml 的复杂对象创建了一个 View 。它采用 Order.cs 模型(因此我可以稍后在其他父模型上重用它,例如 Invoice,因为我很聪明并且会超前考虑。)所以我已经编写了所有这些 javascript 和 View 逻辑,这取决于 View 独立并可与其他模型重复使用。我的声明文本框如下所示:

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

当我单击“提交”时,我注意到的第一件事是订单对象中的任何值都没有回发。所以我坐在那里调试,这需要一段时间,但我最终发现这不会以这种方式工作。除非有办法单独序列化 View 模型,然后将其附加到父模型,否则您必须编写一堆 Javascript 来手动覆盖默认表单提交过程,以及您可能正在提交的任何其他模型用于客户端字段验证。
我认为应该有一种更简单的方法来处理这个问题。我知道解决这个问题的方法,但它并不漂亮。您“可以”为 Order.cs 创建 View 以改为接收 Customer.cs 模型。然后,像这样使用文本框进行声明:

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

定义 View 的所有属性。这将与默认绑定(bind)一起工作,一切都很好。除了,我已经用 JavaScript 编写的代码呢?我必须仔细检查并将“Order_”附加到表格上所有对 ID 的引用。此外,这现在在模型之间不容易移动,每次我创建一个使用 Order 对象的新模型时我都必须重新创建这个 View ,因为它现在采用 Customer.cs 模型。我还必须重写 javascript,或者想出一些奇特的方法来传递前缀 (ViewData)。这似乎不正确。我做错了什么?

最佳答案

如果您为所有使用 Order 的 View 模型创建一个接口(interface)会怎么样:

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

在您常用的订单 View 中使用此界面:

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

如果是 Customer,您可以创建派生自 IWithOrder 的 Customer View 模型:

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

    public Customer Customer { get; set; }
}

现在您可以重用 Order View ,但是您的 View 模型需要派生自 IWithOrder。

您还可以在TextBoxForhtmlAttributes 参数中设置html 元素的id。如果您不想在 js 引用中附加 Order_

关于javascript - MVC 手动序列化复杂对象或模型绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31142314/

相关文章:

c# - Asp.net C# SQL Server 更新查询不适用于所有列

c# - 是否可以使用 ReadOnlySpan<char> 从字符串中解析 int

javascript - 如何将validation_errors()放在文本字段的右侧?

javascript - 从页面上的 Google Analytics 跟踪代码获取帐户 ID

Javascript - 安全检查/访问潜在 undefined object 属性的速记符号

c# - 编码 UI C# - 如何将捕获的图像上传到 Azure 存储容器

c# - 如何在 C# 中向现有 XML 添加新的 XmlElement?

.net - 自 2012 年 6 月升级 SDK 1.7 以来,Azure 部署不断回收

javascript - SameOrigin 策略干扰 Google 文档

Javascript 在随机播放时调整图像大小