Как вернуть список или коллекцию в контроллер из View в MVC 3? - PullRequest
9 голосов
/ 10 февраля 2012

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

Вот мое мнение:

@model List<Regions.SOA.UI.CopyBookSchemaCreator.Models.FieldModel>

<script type="text/javascript" src="~/Scripts/jquery-ui-1.8.11.min.js"></script>

@using (Html.BeginForm("GetResponse", "TestMethods", FormMethod.Post))
{

<table id="tblMethods">
    <tr>
        <th>
            Property Name
        </th>
        <th>
            Request
        </th>
    </tr>

    @foreach (FieldModel fieldModel in Model) 
    {
        <tr>
            <td>
                @Html.DisplayFor(m => fieldModel.PropertyName)
            </td>
            <td>
                @Html.TextBoxFor(m => fieldModel.PropertyValue)
            </td>
        </tr>
    }

</table>

<div>
    <input type="submit"/>       
</div>

, а вот мой контроллер:

    [HttpPost]
    public ActionResult GetResponse(List<FieldModel> fieldModelList)
    {
        return GetResponse(fieldModelList);   
    }

Я использую метод HttpPost, но если я помещаю точку останова прямо внутри него, я возвращаю null для fieldModelList сразу же, как я надеялся, это будет список значений, которые я ввелв тексбоксы на представлении, которое имеет модель FieldModel ...

Я думаю, что что-то не так с моей логикой по сравнению с моим синтаксисом, или, может быть, так же, как и с моим синтаксисом, но в основном я хочу вернутьвернуть список типа FieldModel с каждым соответствующим PropertyName и PropertyValue контроллеру.Я заметил, что я не передаю какой-либо параметр id в своем выражении BeginForm в представлении.Нужен ли здесь один?

На всякий случай, вот мой класс модели для FieldModel:

namespace Regions.SOA.UI.CopyBookSchemaCreator.Models
{
    public class FieldModel
    {
        [Display(Name = "Property")]
        public string PropertyName { get; set; }

    [Display(Name = "Value")]
        public string PropertyValue { get; set; }
    }
}

1 Ответ

5 голосов
/ 10 февраля 2012

Фил Хаак некоторое время назад написал статью , объясняющую, как связывать коллекции (ICollection) для просмотра моделей. В нем подробно рассказывается о создании шаблона редактора, что вы, безусловно, могли бы сделать.

По сути, вам нужно добавить префикс имен атрибутов HTML-элементов к индексу.

<input type="text" name="[0].PropertyName" value="Curious George" />
<input type="text" name="[0].PropertyValue" value="H.A. Rey" />

<input type="text" name="[1].PropertyName" value="Ender's Game" />
<input type="text" name="[1].PropertyValue" value="Orson Scott Card" />

Тогда ваш контроллер может связать коллекцию FieldModel

[HttpPost]
public ActionResult GetResponse(List<FieldModel> fieldModelList)
{
    return GetResponse(fieldModelList);   
}

Я не уверен на 100%, что следующие атрибуты правильно назвали бы атрибуты (я бы порекомендовал использовать шаблон редактора), но вы можете легко использовать аргумент htmlAttributes и дать ему имя, используя индекс.

@for(int i = 0;i < Model.Count;i++) 
{
    <tr>
        <td>
            @Html.DisplayFor(m => m[i].PropertyName)
        </td>
        <td>
            @Html.TextBoxFor(m => m[i].PropertyValue)
        </td>
    </tr>
}

Шаблон редактора

Если вы хотите пойти дальше, добавив шаблон редактора, добавьте частичное представление с именем FieldModel.ascx к /Views/Shared, которое строго типизировано к FieldModel

@model Regions.SOA.UI.CopyBookSchemaCreator.Models.FieldModel

@Html.TextBoxFor(m => m.PropertyName) @* This might be a label? *@
@Html.TextBoxFor(m => m.PropertyValue)

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

@for (int i = 0; i < Model.Count; i++) { 
    @Html.EditorFor(m => m[i]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...