ASP.NET MVC: динамическое добавление частичных представлений и их отражение в модели представлений - PullRequest
1 голос
/ 23 мая 2019

Ситуация: у меня есть страница ASP.NET Razor, которая построена из частичных.

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

Таким образом, главная страница Razor выглядит примерно так:

@model MyProject.MainViewModel

@*Other stuff...*@

@foreach (Subtype v in Model.SubViewModel)
{
         Html.RenderPartial("MyPartial", v);
}

А частичное выглядит так:

@model Subtype 

@Html.HiddenFor(t=>t.ParentViewModelID)

@Html.EditorFor(t=>t.Field1)
@Html.EditorFor(t=>t.Field2)

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

Предположим, пользователь нажимает кнопку, которая в конечном итоге предназначена для добавления в одну из этих коллекций моделей представлений.Я могу AJAX вернуться на сервер, отобразить соответствующий фрагмент и вернуть его клиенту:

[System.Web.Mvc.HttpGet]
public ActionResult AddSubtype(int mainViewModelId)
{
  var model = new Sub { ParentViewModelID=mainViewModelId};
  return PartialView("MyPartial", model);
}

И затем я использую небольшой скрипт, чтобы вставить это в DOM, где он принадлежит:

 success: (data) => {  $('#subtypeHanger').append(data);},

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

Я пытался отладить это, но мне интересно в общих чертах, возможно ли это, или альтернативно, сколько MVC должен абстрагироваться от таких вещей.Очевидно, я могу сделать что-то с помощью JavaScript, чтобы заставить это работать.Есть ли шаблон ASP.NET MVC для этого, который я должен эмулировать, хотя?


РЕДАКТИРОВАТЬ: я упомяну некоторые вещи, которые я пробовал, так как я отправил это:

  1. Управление атрибутами «name» и «id» элементов управления редактированием частичных представлений вручную, чтобы они в конечном итоге выглядели так, как если бы я вкладывал эти элементы управления в основной вид вместо частичного (т. Е. Дольше, стекст и индекс).

  2. Использование класса модели основного вида для частичных чисел.Это заставляет меня переместить петли в частичное.Свойства «name» и «id» выглядят так же, как и в первом # 1, но этот дизайн значительно усложняет процесс возврата частичного из моих вызовов AJAX.

  3. Использование«для» циклов вместо «foreach».Само по себе это не дает того, чего я хочу.

Все это говорит о том, что если № 1 или № 2 - лучший образец для того, что я делаю, возможно, я смогу сделать эторабота.

1 Ответ

0 голосов
/ 03 июня 2019

"Ситуация: у меня есть страница ASP.NET Razor, которая составлена ​​из частичек."

  • Трюк с именами ваших полей

    @Html.HiddenFor(t=>t.ParentViewModelID ,new { htmlAttributes = new { @Name = "[" + i + "].ParentViewModelID" } })
    @Html.EditorFor(t=>t.Field1 ,new { htmlAttributes = new { @Name = "[" + i + "].Field1" } })
    @Html.EditorFor(t=>t.Field2 , new { htmlAttributes = new { @Name = "[" + i + "].Field2" } })
    
  • , поэтому будет

    <input type="text" name="[0].Field1" />
    <input type="text" name="[0].Field2" />
    <input type="text" name="[1].Field1" />
    <input type="text" name="[1].Field2" />
    
  • и лучше (для привязки модели ASP.NET mvc 5), если вы используете

    public ActionResult Edit(MainViewModel master, List<Subtype> details)
    

Если вы предоставили полную модель, я приведу полный рабочий пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...