Ajax 在MVC5中从EditorTemplates提交复杂数据的正确方法

Ajax 在MVC5中从EditorTemplates提交复杂数据的正确方法,ajax,asp.net-mvc-5,Ajax,Asp.net Mvc 5,我正在开发我的UserProfile编辑器,并为此使用EditorTemplates,但我无法找到使用此方法提交复杂对象数据的正确方法。我不知道是否有正确的视图,以及如何从所有局部视图中滚动复杂对象。为了简化,我将对其进行精简,但是我的UserProfile有许多表示用户偏好的子对象 CREATE TABLE [dbo].[UserProfile] ( [UserProfileId] INT IDENTITY (1, 1) NOT NULL, [Nic

我正在开发我的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>
选项2-立即编辑子对象,不要在顶级视图中提交它们。在这个选项中,我的ThumbnailImage编辑器将使用Ajax立即更新数据库,方法是保存图像数据本身,然后使用ID更新父对象(如果它已更改)。这样,当用户提交顶级UserProfile编辑器时,它只会提交昵称,并且对子对象的任何更新都已经完成。出于平滑用户界面的原因,我喜欢这个选项,但我也可以让选项1在用户面前显得平滑

选项3-取消子对象(ThumbnailImage)的编辑器模板,并在父(UserProfile)视图中编辑它们-这意味着我将在视图中重复代码,因为其他东西将有ThumbnailImage对象,而不仅仅是用户配置文件。将整个对象放在一个视图中比较简单,但我看不出这有什么好处(但是,这是我们在工作中所做的,我们不使用模型绑定)

我该如何确定该选择哪一个,或者有没有更好的选择我没有考虑


目前我正在做选项1。它可以工作,但代码太多,不太可重用。

我不知道你的设置是如何工作的,也不懂C语言。但这是Erlang参与者流行的一种标准做法,目前正被面向对象设计、Scala的Akka框架、Ember.js的多个组件等使用

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

现在想象一棵物体树。有一个名为supervisor的根对象。每个节点都有称为workers的子节点和称为其supervisor的父节点。每个节点管理其所有子节点

监督的定义是确保被监督的参与者或更一般地说对象处于可接受的状态。可以获取请求、处理请求并回复。例如,在异常情况下,主管可以选择重新初始化受监督的参与者

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

自然地,根创造了一种形式。表单是root的子级,创建了两个参与者,负责处理
标记,一个负责发送submit

当submit actor告诉它的父窗体它应该提交。表单询问每个输入的值,从中构建一个dict/hash,并用该数据回复root


现在root负责将这些数据发送到服务器。这样,逻辑、数据、状态和行为尽可能地停留在最局部的地方

我不知道你的设置是如何工作的,也不了解C#的东西。但这是Erlang参与者流行的一种标准做法,目前正被面向对象设计、Scala的Akka框架、Ember.js的多个组件等使用

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

现在想象一棵物体树。有一个名为supervisor的根对象。每个节点都有称为workers的子节点和称为其supervisor的父节点。每个节点管理其所有子节点

监督的定义是确保被监督的参与者或更一般地说对象处于可接受的状态。可以获取请求、处理请求并回复。例如,在异常情况下,主管可以选择重新初始化受监督的参与者

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

自然地,根创造了一种形式。表单是root的子级,创建了两个参与者,负责处理
标记,一个负责发送submit

当submit actor告诉它的父窗体它应该提交。表单询问每个输入的值,从中构建一个dict/hash,并用该数据回复root

现在root负责将这些数据发送到服务器。这样,逻辑、数据、状态和行为尽可能地停留在最局部的地方

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 
     }
 });