Анализ значений сообщений формы из таблицы в ASP.NET MVC?

Хорошо, я новичок в MVC, работающий с веб-формами, поэтому извините за невежество. Вот мой сценарий. У меня есть таблица, состоящая из списка приложений и связанных с ними разрешений. Каждая строка таблицы состоит из 3 частей информации: флажка, некоторого текста, описывающего строку, и выпадающего списка, позволяющего пользователю выбрать соответствующее разрешение для приложения. Я хочу опубликовать эти данные и работать только с теми строками в таблице, которые были проверены (идентификатор строки встроен как имя флажка). Оттуда я хочу получить выбранное значение из DropDownList и вызвать необходимый код для обновления БД. Вот код моей страницы просмотра:

            <%foreach (var app in newApps)
              { %>
                <tr>
                    <td><input type="checkbox" name="AddApps" value="<%=app.ApplicationId %>" /></td>
                    <td><%=Html.Encode(app.ApplicationName)%></td>
                    <td><%=Html.DropDownList("AppRole", new SelectList(app.Roles, "RoleId", "RoleDescription"))%></td>
                </tr>
              <%} %>

Как мне получить соответствующие значения из FormCollection, когда я доберусь до контроллера в сообщении формы? Я делал это в прошлом, когда у меня были только значения флажков для извлечения, просто вызывая Request.Form["CheckBoxName"] и анализируя строку.

Или я говорю об этом совершенно неправильно?


person Mark Struzinski    schedule 09.01.2009    source источник
comment
Взгляните на эту ссылку stackoverflow.com/questions/5088450/   -  person Arshad Parwez    schedule 15.03.2012


Ответы (2)


Вы наполовину правы, чтобы опубликовать свои данные, чтобы контроллер мог прочитать информацию, которая должна быть внутри формы:

       <% using(Html.BeginForm("Retrieve", "Home")) %>//Retrieve is the name of the action while Home is the name of the controller
       <% { %>
            <%foreach (var app in newApps)              { %>  
          <tr> 
               <td><%=Html.CheckBox(""+app.ApplicationId )%></td>      
          <td><%=Html.Encode(app.ApplicationName)%></td>
                <td><%=Html.DropDownList("AppRole", new SelectList(app.Roles, "RoleId", "RoleDescription"))%></td> 
           </tr>  
        <%} %>
       <input type"submit"/>
     <% } %>

и на вашем контроллере:

      public ActionResult Retrieve()
    {
        //since all variables are dynamically bound you must load your DB into strings in a for loop as so:
      List<app>=newApps;
      for(int i=0; i<app.Count;i++)
      {


        var checkobx=Request.Form[""+app[i].ApplicationId];
        // the reason you check for false because the Html checkbox helper does some kind of freaky thing for value true: it makes the string read "true, false"
          if(checkbox!="false")
          {
          //etc...almost same for other parameters you want that are in thr form
          }

       }
    //of course return your view
    return View("Index");//this vaires by the name of your view ex: if Index.aspx
   }

Этот сайт дает более подробную информацию о том, как обращаться с помощником раскрывающегося списка:

http://quickstarts.asp.net/previews/mvc/mvc_HowToRenderFormUsingHtmlHelpers.htm

person TStamper    schedule 09.01.2009

Request.Form по-прежнему будет работать, за исключением того, что все ваши флажки имеют одинаковое имя.

Таким образом, одним из способов было бы дать флажкам разные имена, например. «AddApps-app.id» и используйте Request.Form.

Однако более элегантным и проверяемым способом является использование привязки списка.

В этой модели вы даете своим элементам формы определенное структурированное имя, и связыватель модели по умолчанию будет заключать каждый набор элементов формы в список типизированных записей в контроллере. Это полностью объяснено в этом сообщении в блоге.

Преимущество здесь в том, что ваш контроллер имеет дело только с экземплярами типа приложения и, следовательно, не имеет неявной зависимости от того, как структурировано представление. Таким образом, очень легко проводить модульное тестирование.

person Craig Stuntz    schedule 09.01.2009