Получить дочерние объекты сущности в форме, отправленной в jQuery - PullRequest
1 голос
/ 21 апреля 2020

Предположим, у меня есть две таблицы в EF, которые связаны между собой:

public partial class Table1 
{
    public int Id {get; set;}
    public int Table2Id {get; set;}
    public virtual Table2 Table2 {get; set}
}
public partial class Table2 
{
    public Table2()
    {
        Table1 = new HashSet<Table1>
    }

    public int Id {get; set;}
    public string datastring {get; set;}
    public virtual Icollection<Table1> Table
}

Я, очевидно, упростил это, но он достаточно хорошо напоминает мою реальную проблему.

Обычно я могу легко извлечь данные из формы, отправленной в jQuery, если это всего лишь одна таблица. Что я хотел бы сделать так:

form.serializeArray();

Однако в этом случае я хочу извлечь данные из моей формы, которые помещаются в «дочернюю» таблицу моей фактической таблицы.

<div class="container">
    <form id="MyForm">
        <input name="Table1.Table2.dataString" />
        <button type="submit">save</button>
    </form>
</div>

У меня такое ощущение, что этот сценарий поддерживается в. net MVC, но я понятия не имею, как на самом деле делать именование, чтобы оно понимало, что оно принадлежит детский стол.

Быстрый и грязный способ - нацелить каждое поле ввода в моей форме. Но это большая форма, поэтому я действительно хотел бы избежать этого безумия селектора.

Обновление:

Несмотря на то, что я еще не создал свой контроллер, я считаю, что он должен получить объект Table1 следующим образом:

public ActionResult UpdateTables(Table1 table1)
{
    //Logic to call serviceclass
}

1 Ответ

0 голосов
/ 21 апреля 2020

В синхронном POST (не AJAX) дочерние записи должны быть размещены по индексу;

<input name="Table1.Id" value="1">

<input name="Table1.Table2[0].Id" value="1">
<input name="Table1.Table2[0].datastring" value="1A">

<input name="Table1.Table2[1].Id" value="2">
<input name="Table1.Table2[1].datastring" value="2B">

<input name="Table1.Table2[2].Id" value="3">
<input name="Table1.Table2[2].datastring" value="3C">

Если вы собираетесь использовать AJAX и действие контроллера принимает объект типа Table1;

public ActionResult UpdateTables(Table1 table1)
{
    //Logic to call serviceclass
}

Затем вам нужно отформатировать ваш json объект следующим образом (form.Serialize не будет работать, вам нужно отформатировать его вручную, зацикливая дочерние объекты);

{
   Id: 1,
   Table2: [
      { Id: 1, datastring: "1A" },
      { Id: 2, datastring: "2B" },
      { Id: 3, datastring: "3C" }
   ]
}

Я предлагаю, чтобы на вашем HTML добавилась оболочка для ваших дочерних сущностей, div с классом;

<div class="child">
   <input name="Table1.Table2[0].Id" value="1">
   <input name="Table1.Table2[0].datastring" value="1A">
</div>

<div class="child">
   <input name="Table1.Table2[1].Id" value="2">
   <input name="Table1.Table2[1].datastring" value="2B">
</div>

, чтобы вы могли l oop через этот child класс и заполните ваш массив Table2.

var childArray = [];

// loop through elements with child class and access the input fields and assign to an array
$(".child").each(function(){
   var id = $(this).find("input").eq(0).val();
   var datastring = $(this).find("input").eq(1).val();

   var childObject = {id:id,datastring:datastring};
   childArray.push(childObject);
});

// create your json to submit via ajax
var jsonToSubmitToController = {
   Id: $("#table1Id").val(),
   Table2: childArray
};

form.Serialize для неработающего json объяснено здесь; JSON публикация объекта с использованием сериализации формы без сопоставления с c# объектом `

...