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

StackOverflow https://stackoverflow.com/questions/1000217

Вопрос

Основанный на:MVC Html.Проблема с флажком и отправкой формы

Давайте рассмотрим следующий пример.Вид:

   <% 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
 }

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

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

Например:

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

или

public ActionResult Retrieve(AppList<App> applist) 

и т.д.

Это было полезно?

Решение

Контроллер:

[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" />
<% } %>

Читать это: Scott Hanselman's 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" />
<% } %>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top