【问题标题】:Correct method to submit complex data from EditorTemplates in MVC5从 MVC5 中的 EditorTemplates 提交复杂数据的正确方法
【发布时间】:2015-07-03 08:39:41
【问题描述】:

我正在使用我的 UserProfile 编辑器并为此使用 EditorTemplates,但我无法找到使用此方法为复杂对象提交数据的正确方法。我不知道我是否有正确的视图,以及如何从所有部分视图中汇总复杂对象。为简化起见,我将把它减少一点,但我的 UserProfile 有许多代表用户偏好的子对象。

CREATE TABLE [dbo].[UserProfile] (
    [UserProfileId]     INT           IDENTITY (1, 1) NOT NULL,
    [NickName]          VARCHAR (MAX) NOT NULL,
    [ThumbnailImageId]  INT           NULL,
);

在我的实体中,我有指向 ThumbnailImage 对象的导航对象,所以在我的 EditorTemplate(对于 UserProfile)中我可以这样做:

<div class="form-group">
    @Html.LabelFor(model => model.NickName, htmlAttributes: new { @class = "control-label col-md-2" })
    @Html.EditorFor(model => model.NickName, new { htmlAttributes = new { @class = "form-control" } })
</div>

<div class="form-group">
    @Html.LabelFor(model => model.ThumbnailImage, "ThumbnailImage", htmlAttributes: new { @class = "control-label col-md-2" })
    @Html.EditorFor(model => model.ThumbnailImage, new { @class = "form-control" })
</div>

请注意,第二个 EditorFor 是 ThumbnailImage 对象,而不是 ID。我有该对象的 EditorTemplate,但我不确定哪个是最好的编码方式。我知道如何做这些,我只是在寻找选择哪种方式。如果有这方面的“最佳实践”,请告诉我。

选项 1 - “手动”在 UserProfile 视图中卷起顶级对象。 对于此选项,我将在 UserProfile 视图中进行 Ajax 调用,它会提交整个对象,包括ThumbnailImageId 它将使用 HTML 元素 ID 的前缀从带有 JQuery 的 ThumbnailImage 编辑器中获取。因此,我的提交按钮将位于 UserProfile EditorTemplate 中,其操作如下所示...(除了会生成 URL 和元素 ID)

var NickName = $('#MyNickNameId').val();
var ThumbnailImageId = $('#ImageEditorId').val();
$.ajax({
     url: '/Account/UserProfile',
     contentType: 'application/html; charset=utf-8',
     data: {
        UserProfileId: idVal, 
        NickName: NickName,
        ThumbnailImageId: ThumbnailImageId 
     }
 });

选项 2 - 立即编辑子对象,不要在顶级视图中提交它们。在这个选项中,我的 ThumbnailImage 编辑器将使用 Ajax 立即更新数据库,方法是保存图像数据本身,然后使用 ID 更新父对象(如果它改变了)。这样,当用户提交顶级 UserProfile 编辑器时,它只会提交 NickName,并且对子对象的任何更新都已经完成。出于流畅的 UI 原因,我喜欢这个选项,但我也可以让选项 1 对用户来说也显得流畅。

选项 3 - 取消子对象 (ThumbnailImage) 的 EditorTemplates 并在父 (UserProfile) 视图中编辑它们 - 这意味着我将在视图中有重复的代码,因为其他事物将具有 ThumbnailImage 对象,而不仅仅是用户配置文件。将整个对象放在一个视图中稍微简单一些,但我并没有真正看到这样做的任何优势(但是,这是我们在工作中所做的,我们不使用模型绑定)

我如何确定要使用哪个选项,或者是否有更好的选项我没有考虑?

目前我正在做选项 1。它可以工作,但它的代码很多,而且不可重复使用。

【问题讨论】:

    标签: ajax asp.net-mvc-5


    【解决方案1】:

    我不知道你的设置是如何工作的,也不了解 C# 的东西。但这是一个标准实践,目前由面向对象设计、Scala 的 Akka 框架、Ember.js 的多个组件等使用的 Erlang 演员流行起来。

    想象一个以数据为中心的树。有一个根节点。每个节点都有一个子节点和一个父节点。

    现在想象一棵对象树。有一个称为主管的根对象。每个节点都有一个称为工人的子节点和一个称为其主管的父节点。每个节点都监督它的所有子节点。

    监督被定义为确保被监督的actor或更一般的术语object处于可接受的状态。可以获取请求,处理它们并回复。例如,在异常情况下,主管可能会选择重新初始化受监督的参与者。

    在这样的系统中,根获取最抽象的消息,例如 getCredentials,并负责构建工人、拆分任务和跟踪本地状态。

    root 自然会创建一个表单。作为 root 的孩子的表单创建了两个参与者负责处理 &lt;input&gt; 标签和一个负责发送提交。

    当提交参与者告诉其父表单它应该提交时。 Form 询问每个输入的值,从中构建一个 dict/hash 并用该数据回复 root。

    现在 root 负责将这些数据发送到服务器。通过这种方式,逻辑、数据、状态和行为尽可能地保留在大多数本地位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多