Правильная отправка форм с автоматически созданными элементами управления

Asked
Viewd158

0

На основе: MVC Html.CheckBox и проблема отправки формы

Рассмотрим следующий пример. Просмотр:

    <% using(Html.BeginForm("Retrieve", "Home")) %>
       <% { %>
    <%foreach (var app in newApps)              { %>  
  <tr> 
       <td><%=Html.CheckBox(""+app.ApplicationId )%></td>      

   </tr>  
<%} %>
 <input type"submit"/>
<% } %>
 

Контроллер:

  List<app>=newApps; //Database bind
 for(int i=0; i<app.Count;i++)
 {

    var checkbox=Request.Form[""+app[i].ApplicationId];
    if(checkbox!="false")// if not false then true,false is returned
 }
 

Предлагаемое решение касалось ручного синтаксического анализа Request.Form, который, на мой взгляд, выходит за рамки концепции MVC. Это создает проблему при модульном тестировании этого метода контроллера. В этом случае мне нужно сгенерировать фиктивный объект Request.Form вместо некоторой ViewModel, переданной в качестве входного параметра.

В: Есть ли другое решение для отправки таких форм, чтобы объект ViewModel, содержащий коллекцию отправленных элементов управления, передавался в качестве входного параметра методу контроллера?

Например:

 [AcceptVerbs(HttpVerbs.Post)]
public ActionResult Retrieve(AppList[] applist) 
 

или

 public ActionResult Retrieve(AppList<App> applist) 
 

и т. д.

  • Андрей, я выложил другое решение. Попробуйте.

    eu-ge-ne17 июня 2009, 20:04

1 ответов

0

Контроллер:

 [AcceptVerbs(HttpVerbs.Post)]
public ActionResult Retrieve(AppList[] applist)
 

Просмотр:

 <% using(Html.BeginForm("Retrieve", "Home")) %> { %>
    <%foreach (var app in newApps) { %>
    <tr>
        <td><%=Html.CheckBox(String.Format("appList[{0}].AProperty", app.ApplicationId) %></td>
    </tr>
    <% } %>
    <input type"submit" />
<% } %>
 

Прочтите это: ComputerZen.com Скотта Хансельмана - формат провода ASP.NET для привязки модели к массиву , Списки, Сборники, Словари

Если ApplicationId является ключом от БД, лучше использовать AppList<App> в качестве параметра действия. Тогда ваша форма будет выглядеть так:

 <% using(Html.BeginForm("Retrieve", "Home")) %> { %>
<% var counter = 0; %>
    <% foreach (var app in newApps) { %>
    <tr>
        <td><%=Html.CheckBox(String.Format("appList[{0}].Key", counter), app.ApplicationId) %></td>
        <!-- ... -->
        <td><%=Html.Input(String.Format("appList[{0}].Value.SomeProperty1", counter), app.SomeProperty1) %></td>
        <td><%=Html.Input(String.Format("appList[{0}].Value.SomePropertyN", counter), app.SomePropertyN) %></td>
        <% counter = counter + 1; %>
    </tr>
    <% } %>
    <input type"submit" />
<% } %>
 

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

    Andriy Tkach17 июня 2009, 21:55
  • Вроде то, что мне было нужно, но пока мне это не удалось. 1. Обнаружил, что если app.ApplicationId не заказан и есть дыры. поскольку это ключ db (пример 1, 2, 5, 11), параметр приложения приходит в контроллер как null. Если я возьму какой-нибудь повторяющийся ключ, например , он сработает. 2. Вторая проблема заключается в том, что он подчиняется формированию (конечно) всех объектов, даже если флажок не установлен. Добавление в модель дополнительного поля, указывающего, выбрана ли такая запись, кажется мне не очень хорошей идеей.

    Andriy Tkach16 июня 2009, 23:39