ASP.NET MVC FormCollection TextArea

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

     var DescList = FormValues["Item.Description"].Split(',').Select(item => item).ToList<string>();
//will not work for obvious reasons. Comma delimited FormCollection has commas to identify separate row data.

Похоже, что Microsoft разработала FormsCollection без учета элемента управления textarea. Текстовая область с запятыми не будет работать при попытке доступа к каждому значению. Что интересно, свойство _entriestables имеет идеальный формат, но они решили сделать его частным свойством. Очень расстраивает.

`

Here is the important part of my viewmodel.
 public class TenantViewModel
{
    public Tenant Tenant { get; set; }
                public Site Site { get; set; }

    }

Мое представление заполняется следующим образом:

    if (Model != null && Model.Tenant != null && Model.Tenant.Site != null && Model.Tenant.Site.Count() > 0)
    {<div class="detailsbox_view">
        <table id="tblTenantSites">
            <tr>
                <th>@Html.LabelFor(item => item.Site.Title)</th>
                <th>@Html.LabelFor(item => item.Site.Description)</th>

            </tr>
        @foreach (var Item in Model.Tenant.Sites)
           {
            <tr>
                @Html.HiddenFor(modelItem => Item.SiteId)


                <td>
                    @Html.EditorFor(modelItem => Item.Title)
                                        </td>
                <td>
                    @Html.TextAreaFor(modelItem => Item.Description, new {@width="400" })

                </td>

            </tr>   }
        </table>

Как вы видите, эта таблица сайта является дочерним элементом объекта Tenant. Эта дочерняя запись не обновляется автоматически с помощью этого метода, но данные арендатора обновляются автоматически. По этой причине я вместо этого попробовал FormColelction. Есть ли что-то, чего мне не хватает, чтобы сделать эту работу?


person Nate    schedule 19.08.2011    source источник
comment
Можете ли вы опубликовать пример вашей модели и ввода?   -  person Daniel A. White    schedule 19.08.2011
comment
Нет причин использовать FormValues['whatever']. Вы должны отправить модель обратно в контроллер   -  person Chase Florell    schedule 20.08.2011
comment
Можете ли вы опубликовать, как выглядит ваш взгляд?   -  person Chase Florell    schedule 20.08.2011
comment
Спасибо. Я только что обновил свой вопрос.   -  person Nate    schedule 20.08.2011
comment
Я предполагаю, что вы даете своим пользователям возможность редактировать описание нескольких сайтов на одном представлении/странице. И вы столкнулись с проблемой привязки коллекции, которая является общей для новых разработчиков MVC. Этого можно легко избежать, если вы просто решите разрешить пользователю редактировать только один Сайт за раз. И, ИМХО, это также обеспечит гораздо лучший пользовательский опыт.   -  person mare    schedule 21.08.2011
comment
Это ограниченный список, и он работает для того, что я пытаюсь сделать. И я знаю, что ваша рекомендация такова, как это делается, но это не лучший подход к тому, что я делаю. Да, давайте просто отредактируем его на одной странице, нажав кнопку редактирования в строке, потому что дизайн MVC не может обрабатывать тот подход, который вам нужен.   -  person Nate    schedule 21.08.2011


Ответы (3)


попробуй эту полезную функцию

ValueProviderResult Match=FormCollection.GetValue("ValueProvider");
person Leonardo Conde    schedule 21.10.2011

Если у вас есть несколько полей с одним и тем же атрибутом name, они вернутся в ваш FormCollection в виде массива. Итак, после публикации такого вида:

<form action="/Home/MyAction">
    <textarea id="row_one_description" name="description">
        First row's description
    </textarea>
    <textarea id="row_two_description" name="description">
        Second row's description
    </textarea>

    <input type="submit" value="Submit" />
</form>

вы могли бы сделать что-то подобное в своем действии

[HttpPost]
public ActionResult MyAction(FormCollection collection) 
{
    var descriptionArray = collection["description"];

    string firstRowDescription = descriptionArray[0];
    string secondRowDescription = descriptionArray[1];
}

Я должен отметить, что это не рекомендуемый способ работы с размещенными данными. Вместо этого вы должны создавать свое представление, используя данные из модели представления и используя строго типизированные помощники html для отображения ваших элементов управления. Таким образом, когда вы публикуете, ваше действие может принимать ViewModel в качестве параметра. Его свойства будут автоматически связаны, и у вас будет хороший объект для игры.

[HttpPost]
public ActionResult MyAction(MyViewModel viewModel) 
{
    foreach (var row in viewModel.Rows)
    {
        string description = row.Description;
    }
}

ИЗМЕНИТЬ
Я все еще многое предполагаю о вашей ViewModel, но, возможно, попробуйте следующее:

<table id="tblTenantSites">
    <tr>
        <th>@Html.LabelFor(model => model.Site.Title)</th>
        <th>@Html.LabelFor(model => model.Site.Description)</th>
    </tr>

    @for (var i = i < Model.Tenants.Sites.Count(); i++) {
    <tr>
        @Html.HiddenFor(model => model.Tenants.Sites[i].SiteId)

        <td>
            @Html.EditorFor(model => model.Tenants.Sites[i].Title)
        </td>
        <td>
            @Html.TextAreaFor(model => model.Tenants.Sites[i].Description, new { @width="400" } )
        </td>

    </tr>   
    }

</table>
person ajbeaven    schedule 19.08.2011
comment
Как бы я это сделал. У него уже есть описания, разделенные запятыми, когда я делаю следующее: foreach (var key в FormValues.Keys) { if (key.ToString() == Item.Description) { var value = FormValues[key.ToString()]; } } - person Nate; 20.08.2011
comment
О, я вижу, я думал, вы имели в виду, что пользователь должен был ввести данные с разделителями-запятыми в текстовую область. Этот вопрос очень усложняется тем фактом, что вы не включили код для своего представления. Обновил мой ответ чем-то, что может помочь...? - person ajbeaven; 20.08.2011

Вы также можете попробовать,

   string Match=FormCollection.GetValue("ValueProvider").AttemptedValue;
person Suraj Singh    schedule 22.09.2015