Como faço para retornar List ou Collection ao Controller a partir do View no MVC 3?

9

Alguém, por favor, ajude-me a devolver a lista corretamente, do meu ponto de vista. Não vejo por que estou retornando null para meu fieldModelList que tento passar para o controlador ...

Aqui está minha opinião:

@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>

e aqui está meu controlador:

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

Estou atingindo o método HttpPost, mas se eu colocar um ponto de interrupção dentro dele, retornarei null para o fieldModelList logo de cara, o que eu esperava que fosse uma lista dos valores que inseri nos texboxes na exibição que é do modelo FieldModel ...

Eu acho que algo está errado com minha lógica versus minha sintaxe, ou tão bem quanto minha sintaxe, mas basicamente o que eu quero fazer é retornar uma lista do tipo FieldModel com cada PropertyName e PropertyValue para o controller. Percebi que não estou passando nenhum tipo de parâmetro id na minha instrução BeginForm na exibição. Eu preciso de um aqui?

Apenas no caso, aqui está a minha classe de modelo para o 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; }
    }
}
    
por ob1Jakobi 09.02.2012 в 21:53
fonte

1 resposta

5

Phil Haack escreveu um artigo há algum tempo explicando como ligar coleções ( ICollection ) para ver modelos. Ele entra em detalhes adicionais sobre a criação de um modelo de editor, o que você certamente poderia fazer também.

Basicamente, você precisa prefixar os atributos de nome dos elementos HTML com um índice.

<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" />

Em seguida, seu controlador pode vincular a coleção de FieldModel

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

Não tenho 100% de certeza de que os nomes a seguir indicariam os atributos corretamente (eu recomendaria usar o modelo do editor), mas você poderia facilmente usar o argumento htmlAttributes e atribuir um nome usando o índice.

@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>
}

Modelo do Editor

Se você quisesse adicionar um modelo de editor, adicione uma exibição parcial chamada FieldModel.ascx to /Views/Shared que é fortemente tipificada para FieldModel

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

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

E, então, a parte da sua opinião responsável por renderizar a coleção seria:

@for (int i = 0; i < Model.Count; i++) { 
    @Html.EditorFor(m => m[i]);
}
    
por David Fox 09.02.2012 / 22:14
fonte