ASP.NET Model Binder вопрос для обновления дочерней таблицы - PullRequest
0 голосов
/ 11 июля 2009

Я использую Linq to SQL в приложении ASP.NET MVC. Модель состоит из таблицы «Решения» с ссылкой внешнего ключа на таблицу «Параметры» (одно решение, множество параметров). Таким образом, модель позволяет мне получить доступ к коллекции опций через свойство Decision.Options. Я хочу, чтобы мои пользователи могли обновлять коллекцию параметров для решения в отдельном представлении от обновления других свойств решения. Каков наилучший способ передать коллекцию Options обратно в контроллер для обновления объекта Decision? Вот код:

Контроллер отправляет модель решения в представление Options:

   //
    // GET /Decisions/Options/5
     [Authorize]
     public ActionResult Options(int id)
     {
         Decision decision = decisionRepository.GetDecision(id);
         return View(decision);
     }

На странице моего просмотра просто перечислены поля имени параметра, которые пользователи могут изменять и отправлять:

<% using (Html.BeginForm())
{%>
    <div id="answers">
        <table>
        <% int i = 0; %>  
        <% foreach (var item in Model.Options)
           { i += 1;
         %>
            <tr>
                <td>
                    <label>Option #<%= i%>:&nbsp;&nbsp;</label>
                    <%= Html.TextBox("Option.Name", item.Name)%>
                </td>
            </tr>

        <% } %>
        </table>

        <input type="submit" name="button" value="Back" />
        <input type="submit" name="button" value="Next" />
    </div>
    <% } %>

Вот код контроллера для действия Options POST:

     // POST /Decisions/Options/4
     [AcceptVerbs(HttpVerbs.Post), Authorize]
     public ActionResult Options(int id, string button, Decision d)
     {
         Decision decision = decisionRepository.GetDecision(id);

         if (decision == null)
             return View("NotFound");

         if (button == "Back")
         {
             return RedirectToAction("Edit", new { id = decision.DecisionID });
         }

         //Update the options in the decision model             
         //TODO: What's the best way to update the Decision.Options parameter?

         //Save options and move on to factors
         UpdateModel(decision);
         decisionRepository.Save();
         return RedirectToAction("Factors", new { id = decision.DecisionID });
     }

В действии POST для Options каков наилучший способ вернуть коллекцию элементов Option?

Я пытался работать с FormCollection напрямую, чтобы преобразовать его в EntitySet для присвоения Decision.Options перед вызовом метода Save. В приведенном выше коде передается объект Decision, но коллекция Options всегда равна нулю, поэтому мой комментарий TODO.

Я получил это, чтобы работать для непосредственного редактирования объекта Decision, но у меня проблемы с обновлением дочерней таблицы в модели с использованием Model Binder или FormCollection. Любая помощь с благодарностью!

1 Ответ

1 голос
/ 11 июля 2009

Поскольку у вас много потенциальных вариантов, вам нужно отличать каждый вход от других. Вы не можете дать им одно и то же имя.

Вместо:

 <%= Html.TextBox("Option.Name", item.Name)%>

попробуйте использовать:

  <%= Html.TextBox("Option[" + i + "].Name", item.Name)%>

Тогда в вашем действии используйте массив Option в качестве одного из параметров.

общедоступные параметры ActionResult (int id, кнопка string, решение d, параметры []) { ... }

Затем вы можете делать все, что вам нужно, чтобы подключить поставляемые опции к Решению.

См. Статью в блоге Гансельмана по теме.

...