Обновление родительских / дочерних записей с помощью связывателей моделей в ASP.Net MVC - PullRequest
5 голосов
/ 09 июля 2009

Я изменил приложение Nerd Dinner , чтобы разрешить редактирование дочерних записей, добавив следующий код в DinnerForm.ascx

  <p>
    <%int i = 0;
   foreach (NerdDinner.Models.RSVP rsvp in this.Model.Dinner.RSVPs)
       { %>

        <%= Html.Hidden("Dinner.RSVPs[" + i + "].RsvpID", rsvp.RsvpID)%>
        <%= Html.Hidden("Dinner.RSVPs[" + i + "].DinnerID", rsvp.DinnerID)%>
        <%= Html.TextBox("Dinner.RSVPs[" + i + "].AttendeeName", rsvp.AttendeeName)%>
    <% i += 1;
   } %>
    </p>

это рендерит это:

<p>
    <input id="Dinner_RSVPs[0]_RsvpID" name="Dinner.RSVPs[0].RsvpID" type="hidden" value="36" />
        <input id="Dinner_RSVPs[0]_DinnerID" name="Dinner.RSVPs[0].DinnerID" type="hidden" value="63" />
        <input id="Dinner_RSVPs[0]_AttendeeName" name="Dinner.RSVPs[0].AttendeeName" type="text" value="kp" />
    <input id="Dinner_RSVPs[1]_RsvpID" name="Dinner.RSVPs[1].RsvpID" type="hidden" value="37" />
        <input id="Dinner_RSVPs[1]_DinnerID" name="Dinner.RSVPs[1].DinnerID" type="hidden" value="63" />
        <input id="Dinner_RSVPs[1]_AttendeeName" name="Dinner.RSVPs[1].AttendeeName" type="text" value="jim" />

    </p>   

Я не изменял метод действия редактирования сообщения DinnersControler. Обед для родителей обновляется как обычно, но он выглядит как UpdateModel (ужин); не видит / не обновляет дочерние записи RSVP.

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

Обновляет родительские / дочерние записи за один раз, вызывая UpdateModel (Parent); возможно с текущей моделью вяжущих?

Ответы [ 3 ]

4 голосов
/ 09 июля 2009

Я не смог сделать это сам.

Я знаю, что вы можете автоматически обновить один дочерний элемент, то есть Dinner.RSV. Я никогда не видел возможности обновления дочернего перечислимого объекта, что потребовало бы привязки, чтобы узнать, какое свойство является идентификатором, и найти его (т. Е. Dinner.RSVP.Where (r => r.RSVP_ID == input_id), а затем обновить это). Я не знаю достаточно о пользовательском связывании, чтобы сделать что-то подобное.

Однако я сделал цикл и определил rsvp и int в качестве префикса:

Итак, вы делаете:

UpdateModel("Dinner", Dinner);

чтобы обновить родителя, а затем:

int i = 0;

foreach (var r in Dinner.RSVPs) {
  UpdateModel(r, "Dinner.RSVPs[" + i++ + "]");
}

Не совсем так чисто, но у меня это хорошо работает. Впрочем, для создания проверки может потребоваться немного больше усилий (вы хотите проверить все одновременно, и убедитесь, что вы не вернетесь к представлению на первом RSVP с ошибкой).

EDIT : исправлен код, отражающий решение OP, включая ошибку в моем порядке параметров. С учетом вышесказанного мне удобнее использовать свойство RSVP.ID, чем работающее целое число. Если вы знаете, что Dinner.RSVP будут такими же на POST, как и GET (я уверен в этом в моем коде), то использование RSVP.ID будет работать. Если RSVP будут отличаться, то обновятся будут только те, кто присутствует на обоих. Однако использование последовательного типа int может привести к обновлению неверного объекта.

Надеюсь, это поможет, Джеймс

0 голосов
/ 22 сентября 2009

Ваш вопрос заключается в том, обновлять ли родительские / дочерние записи за один раз, вызывая UpdateModel (Parent); возможно с текущей моделью вяжущих?

Да, это возможно. Однако не возможно (без каких-либо незначительных обходных путей), если вы используете Linq-to-Sql и ваши дочерние объекты открываются через EntitySet<T> вместо чего-то вроде IList<T>. Я полагаю, что это будет (было?) Решено в следующей версии MVC из-за ASP.NET 4.0. Однако в настоящее время механизм связывания моделей MVC по умолчанию, похоже, не понимает, как работать с EntitySet.

Пожалуйста, посмотрите этот другой ответ Я написал по связанному вопросу некоторое время назад, с подробностями о том, как я сейчас имею дело с (обходом) этой ситуации в некоторых простых случаях. При этом мне пришлось перестать так сильно беспокоиться о том, насколько «идеальным» является это решение с точки зрения DDD / OOP, в качестве компромисса с простым объединением MVC и LTS для приятной совместной игры с минимальными усилиями.

Обратите внимание, я признаю, что решение Джеймса С, вероятно, является более "чистым", но для того, чтобы сделать это "одним выстрелом", как вы просите, вам нужно либо дождаться ASP.NET 4.0, либо использовать Обходной путь похож на тот, что вы найдете в моем другом посте.

Удачи!

0 голосов
/ 09 июля 2009

Хорошо, так что никто не отвечает. Я не знаю приложение nerddinner, но меня заинтересовала ваша проблема. Хотел увидеть ответы, но, ну, пока нет. Не уверен на 100% из-за недостаточного знакомства с ndinner, но может ли это быть связано с этой публикацией , где упоминается привязка / обновление только при явной передаче свойства?

...