ASP.Net MVC - Редактирование коллекции - итерация FormCollection является лучшим способом? - PullRequest
0 голосов
/ 15 мая 2009

Этот же вопрос был задан здесь , и был дан ответ, который является работоспособным, но с окончательной доработкой инфраструктуры ASP.Net MVC мне стало интересно, есть ли лучшее решение.

Если у меня есть следующая структура классов, как создать страницу представления и, что более важно, вернуть данные обратно в контроллер.

public class Person {


public int Id {get;set;}
  public string Name {get;set;}
  public IList<TelNos> TelNos {get;set;}
}

public class TelNos{
  public string Type {get;set;}
  public string Number {get;set;}
}

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

<% foreach (var telNo in Model.Product.TelNos)
               {%>
            <p><label for="telNo.Type">Type of Number</label>

                <%= Html.TextBox("telNo.Type")%>
                <%= Html.ValidationMessage("telNo.Type", "*")%>
            </p>
<p><label for="telNo.Number">Type of Number</label>

                <%= Html.TextBox("telNo.Number")%>
                <%= Html.ValidationMessage("telNo.Number", "*")%>
            </p>
            <%} %>

Предполагая, что я инициировал 2 объекта TelNos, я бы увидел 2 набора текстовых полей в представлении.

Когда эта форма отправляется обратно, предложение по предыдущему сообщению заключалось в том, чтобы перебрать коллекцию FormCollection в методе post:

[AcceptVerbs( HttpVerb.POST )]
public ActionResult Whatever( FormCollection form )
{
 ....
}

Однако является ли это сейчас лучшим подходом, или дальнейшие обновления MVC предоставили лучшее решение?

Спасибо, Ричард

Ответы [ 3 ]

2 голосов
/ 15 мая 2009

Не было никаких обновлений или лучших практик (насколько я знаю) для обработки динамических форм в посте. Все еще проверенные и верные способы - либо привязать данные к вашей информации, либо выполнить ее итерацию в FormCollection. Если вы посмотрите здесь , это может помочь вам с привязкой данных. ИЛИ в последнем случае вы можете перебирать коллекцию форм, вызывая различные значения с их строковым именем. Хотя это может иметь некоторые конфликты, поскольку все они будут иметь одинаковый идентификатор

 "telNo.Type"
 "telNo.Number"

Возможно, вам придется сделать некоторые манипуляции, чтобы это было что-то вроде

 "telNo.Type[i]"
 "telNo.Number[i]"

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

 "object[i].telNo.Type" 
 "object[i].telNo.Number"

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

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

Мне нравится идея ASP.NET MVC Partial View с формой , которая, в свою очередь, ссылается на Привязка модели к списку

Я думаю, что лучше по двум причинам:

  1. Прохождение FormCollection нарушает идею разделения контроллера формы представления. Контроллер будет иметь слишком много знаний о том, как отображаются данные.
  2. Написание юнит-теста будет болезненным. вам нужно будет вставить все значения в контроллер формы вручную
0 голосов
/ 18 мая 2009

Спасибо за ваш ответ. Ваш ответ дал мне идею, которая, я думаю, отличается от того, что вы предлагаете.

Если я включаю в представление индекс для объекта, тогда построитель модели по умолчанию принимает значения и назначает их связанным объектам. Код вида выглядит следующим образом:

    <% int i=0;
foreach (var telNo in Model.Product.TelNos)
                   {%>
                <p><label for="telNo.Type">Type of Number</label>

                    <%= Html.TextBox("telNo"+i.ToString()+".Type")%>
                    <%= Html.ValidationMessage("telNo"+i.ToString()+".Type", "*")%>
                </p>
    <p><label for="telNo.Number">Type of Number</label>

                    <%= Html.TextBox("telNo"+i.ToString()+".Number")%>
                    <%= Html.ValidationMessage("telNo"+i.ToString()+".Number", "*")%>
                </p>
                <%i++;
} %>

Richard

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...