Правильная подача форм с автоматически сгенерированным контролем - PullRequest
0 голосов
/ 16 июня 2009

На основании: 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) 

и т.д. * * тысяча двадцать-одна

1 Ответ

0 голосов
/ 16 июня 2009

Контроллер:

[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> в качестве параметра Action. Тогда ваша форма будет выглядеть так:

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