none
Não consigo retornar o model RRS feed

  • Pergunta

  • Bom dia! Não estou conseguindo retornar um model para meu controller. Tenho duas classes, uma do edmx chamada Despesa, como abaixo:

    E tenho a classe DespesasProdutos, que herda de despesa, e contem uma Lista de itensDespesa, como abaixo:

    public class DespesasProdutos : Despesa
        {
            public List<itensDespesa> itens { get; set; }
        }
    
        public class itensDespesa
        {
            [Required(ErrorMessage = "* O produto não foi identificado")]
            public int Id { get; set; }
    
            [Required(ErrorMessage = "* A unidade não foi identificada")]
            public string unidade { get; set; }
    
            [Required(ErrorMessage = "* Por favor, Insira a quantidade")]
            public int quantidade { get; set; }
    
            [Required(ErrorMessage = "* O valor unitário não foi identificado")]
            public decimal valorUnit { get; set; }
    
            [Required(ErrorMessage = "* Por favor, Insira o centro de custos")]
            public int centroCusto { get; set; }
    
            [Required(ErrorMessage = "* Por favor, Insira a tarefa")]
            public int tarefa { get; set; }
    
    
    
        }

    A assinatura do meu HttpPost Create é Create(DespesasProdutos dp), que me retorna os dados de uma despesa, entretando os dados do itensDespesa não são retornados de forma alguma... Ja inseri até na bruta alguns campos com os names respectivos e values, e não retorna, não adianta. O que estou fazendo errado? Obrigado.

    terça-feira, 20 de novembro de 2012 11:57

Respostas

  • Kakashi, para você receber uma lista seu html final deve ser assim:

    <input type="text" name="itens[0].Name"/>
    <input type="text" name="itens[1].Name"/>
    <input type="text" name="itens[2].Name"/>
    

    Como você está fazendo?


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    • Marcado como Resposta Kakashi963 terça-feira, 20 de novembro de 2012 19:15
    terça-feira, 20 de novembro de 2012 14:28
  • Neste caso você deve criar dinamicamente os names dos elementos com javascript.

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    • Marcado como Resposta Kakashi963 terça-feira, 20 de novembro de 2012 19:16
    terça-feira, 20 de novembro de 2012 18:11

Todas as Respostas

  • Como está sendo renderizado o html do form? Cola o html ai.

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    terça-feira, 20 de novembro de 2012 12:05
  • @using (Html.BeginForm())
    {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Despesa</legend>
            <div id="validacoes">
                <div>@Html.ValidationMessageFor(model => model.NF_CNF)</div>
                <div>@Html.ValidationMessageFor(model => model.IdTipo)</div>
                <div>@Html.ValidationMessageFor(model => model.IdFornecedor)</div>
                <div>@Html.ValidationMessageFor(model => model.DataPagamento)</div>
                <div>@Html.ValidationMessageFor(model => model.Descricao)</div>
            </div>
    
            <div class="editor-field" style="margin-bottom: 10px;">
                @Html.RadioButton("tipoNF_CNF", "NF") NF
                @Html.RadioButton("tipoNF_CNF", "CNF") CNF
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.NF_CNF, "Código")
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.NF_CNF)
                
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.IdTipo, "Tipo de despesa")
            </div>
            <div class="editor-field">
                @Html.DropDownListFor(x => x.IdTipo, ViewBag.IdTipo as SelectList, "Selecione o tipo de despesa")
                
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.IdFornecedor, "Fornecedor")
            </div>
            <div class="editor-field">
                @Html.DropDownListFor(model => model.IdFornecedor, ViewBag.IdFornecedor as SelectList, "Selecione um Fornecedor")
                
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.DataPagamento, "Data do Pagamento")
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.DataPagamento)
                
            </div>
            <fieldset>
                <legend>Produtos</legend>
                <div id="listaProdutos">
                    <div id="btnsProduto" style="margin-bottom: 10px">
                        @*<input type="button" value="Cadastrar" class="btn" />*@
                        @Html.ActionLink("Cadastrar Novo", "cadastrarProduto", "Despesas", null,
                        new
                        {
                            @class = "btn btn-dialog openDialog",
                            data_dialog_id = "cadastrarDialog",
                            data_dialog_title = "Cadastrar Novo"
                        })
                        @Html.ActionLink("Adicionar Produto", "pesquisarProduto", "Despesas", null,
                        new
                        {
                            @class = "btn btn-dialog openDialog",
                            data_dialog_id = "buscarDialog",
                            data_dialog_title = "Pesquisar Produto"
                        })
                    </div>
                    <table>
                        <tr>
                            <th>
                                Unidade
                            </th>
                            <th>
                                Quantidade
                            </th>
                            <th>
                                Titulo
                            </th>
                            <th>
                                Valor Unitário
                            </th>
                            <th>
                                Valor Total
                            </th>
                            <th>
                                Centro de custo
                            </th>
                            <th>
                                Tarefa/Aplicação
                            </th>
                        </tr>
                    </table>
                    <div id="produtosContainer">
                        
                       
                    </div>
                </div>
                <label id="valorTotalSoma">
                </label>
            </fieldset>
            <div class="editor-label">
                @Html.LabelFor(model => model.Descricao, "Descrição")
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Descricao)
                
            </div>
            <div class="editor-label">
                Valor
            </div>
            <div class="editor-field">
                <input type="text" name="Valor" disabled="true" id="Valor" />
            </div>
            <div id="divPagamento" style="display:none">
                <h3>Forma de pagamento:</h3>
                <br />
                @Html.ActionLink("Buscar conta", "buscarConta", "entrada", null,
                    new
                    {
                        @class = "btn-dialog btn openDialog",
                        data_dialog_id = "buscarDialog",
                        data_dialog_title = "Pesquisar Contas"
                    })
                <br />
                <br />
                <div id="conta">
                </div>
                <div id="resumoFinanceiro">
                </div>
                A vista:
                <input id="vista" type="radio" value="vista" name="formaPagamento" />
                A prazo:<input id="prazo" type="radio" value="prazo" name="formaPagamento" />
                <br />
                <div id="dadosPagamento">
                </div>
                <div id="dadosCartao">
                </div>
                <div id="dadosCheque">
                </div>
                <div id="duplicatas">
                </div>
                <p>
                    <input type="submit" class="btn btn-success" value="Criar" />
                </p>
                </div>
        </fieldset>
    }
    <div>
        @Html.ActionLink("Voltar à lista", "Index")
    </div>
    

    E meu ProdutosContainer é populado com JSON, aqui está o HTML dele, que deveria popular o itensDespesa.

    @model Sacer.Models.Produto
    <script src="../../Scripts/jquery.price_format.1.7.min.js" type="text/javascript"></script>
    <table style="border: none; width: 99%; margin: -10px 0px 10px 4px; padding-bottom: 10px;">
        <tr id="@Model.Id">
            <td>
                @Html.TextBox("unidade", @Model.unidade.Abreviacao)    
            </td>
            <td>
                <input type="text" name="quantidade" " class="quantidade" onchange="javascript:CalculaValorTotalPorProduto(@Model.Id)" />         
            </td>
            <td>
                @Model.Titulo
            </td>
            <td>
                @Html.Hidden("valorUnit", Model.Valor, new { @class = "valorUnit" })
                @String.Format("{0:c}", @Model.Valor)
            </td>
            <td id="valorTotal" style="width: 156px;" class="valorTotal">
            </td>
            <td>
                <input id="numeroObra" name="centroCusto" type="text"onchange="javascript:loadTarefas(@Model.Id)"  />
            </td>
            <td id="tarefaAplicacao">
                <select class="tarefa" name="tarefa">
                </select>
            </td>
        </tr>
        @Html.HiddenFor(x => x.Id)
    </table>

    terça-feira, 20 de novembro de 2012 12:39
  • Descobri que preciso fazer um Model Binder, para tipos complexos. Alguem tem material que me ajude a criar um custom model binder para uma lista?
    terça-feira, 20 de novembro de 2012 13:35
  • Kakashi, para você receber uma lista seu html final deve ser assim:

    <input type="text" name="itens[0].Name"/>
    <input type="text" name="itens[1].Name"/>
    <input type="text" name="itens[2].Name"/>
    

    Como você está fazendo?


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    • Marcado como Resposta Kakashi963 terça-feira, 20 de novembro de 2012 19:15
    terça-feira, 20 de novembro de 2012 14:28
  • Murilo!, estou apenas colocando os mesmo atributos names, mas apenas tipo "name = 'nomeName'. E como faço em casos em que não tenho como controlar dessa forma a quantidade de elementos que serão inseridos? Por exemplo, essa tabela é populada com JSON, deveria receber então sempre names adicionais.
    terça-feira, 20 de novembro de 2012 18:02
  • Neste caso você deve criar dinamicamente os names dos elementos com javascript.

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    • Marcado como Resposta Kakashi963 terça-feira, 20 de novembro de 2012 19:16
    terça-feira, 20 de novembro de 2012 18:11