ASP.NET MVC FormCollection TextArea - PullRequest
       11

ASP.NET MVC FormCollection TextArea

1 голос
/ 19 августа 2011

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

     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 вместо этого. Я что-то упускаю, чтобы сделать эту работу?

Ответы [ 3 ]

1 голос
/ 21 октября 2011

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

ValueProviderResult Match=FormCollection.GetValue("ValueProvider");
0 голосов
/ 22 сентября 2015

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

   string Match=FormCollection.GetValue("ValueProvider").AttemptedValue;
0 голосов
/ 20 августа 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;
    }
}

EDIT
Я все еще много думаю о вашей 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>
...