Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

JavaScript não esta passando string de valores para a camada Controller

Estou tentando enviar uma string de multiplos valores selecionados de uma listBox para a camada Controller e outros campos tb preenchidos, pelo JavaScript, porem os dados do modelo que estão preenchidos na view estão chegando em branco no Controller.

Codigo da View (Campos preenchidos - O de multiplos valores é o Equipamento):

                                <div class="form-group">
                                    <label class="control-label col-md-3 col-sm-3 col-xs-12">Intervalo de Data</label>
                                    <div class="col-md-6 col-sm-6 col-xs-12">
                                        @Html.TextBoxFor(m => m.IntervaloData, new { @class = "form-control", id = "reportrange", style = "cursor: pointer;" })
                                        <i class="col-md-1 glyphicon glyphicon-calendar fa fa-calendar" style="z-index: 2; top:-23px; left:94%"></i>
                                    </div>
                                </div>

                                <div class="form-group">
                                    <label class="control-label col-md-3 col-sm-3 col-xs-12">Equipamento: <span class="required"></span></label>
                                    <div class="col-md-6 col-sm-6 col-xs-12">
                                        @Html.DropDownListFor(model => model.Equipamento, new RELATORIO.Models.UtilCombobox().Equipamento(), new { @class = "form-control", multiple = "multiple" })
                                    </div>
                                </div>



                                <div class="form-group">
                                    <label class="control-label col-md-3 col-sm-3 col-xs-12">Produto: <span class="required"></span></label>
                                    <div class="col-md-6 col-sm-6 col-xs-12">
                                        @Html.DropDownListFor(model => model.Produto, new RELATORIO.Models.UtilCombobox().Produto(), "Selecionar Todos", new { @class = "form-control" })
                                    </div>
                                </div>

                                <div class="form-group" style="text-align: center;">
                                    <button type="submit" class="btn btn-success submit" id="btnGerarRelatorio">Gerar Relatório</button>
                                </div>

Script na View:

            $('#Equipamento').on('change', function () {
                $("#hddEquipamentos").val("");
                $('#Equipamento option:selected').each(function () {
                    $("#hddEquipamentos").val($("#hddEquipamentos").val() + $(this).text() + ",");
                });
            });

            $('#btnGerarRelatorio').click(function () { debugger;

                var Equipamento1 = {};
                Equipamento1 = $("#hddEquipamentos").val().substring(0, ($("#hddEquipamentos").val().length - 1)).split(",");

                var equipment = {
                    Equipamentos: Equipamento1
                };

                $.ajax({
                    type: "POST",
                    url: "Setup",
                    data: equipment,
                    dataType: "html",
                    success: function (response) {
                        $("#x_content").html(response);
                    },
                    failure: function (response) {
                        alert(response.responseText);
                    },
                    error: function (response) {
                        alert(response.responseText);
                    }
                });
            });

Codigo do Controller:

        [HttpPost]
        [Authorize]
        public ActionResult Setup(Filtro filtro)
        {

            DateTime dtInicial = filtro.getDataInicial();
            DateTime dtFinal = filtro.getDataFinal();

            BancoDeDados.dcTseOEEDataContext bd = new BancoDeDados.dcTseOEEDataContext();

            List<FiltroSetup> listaRelatorio = new List<FiltroSetup>();
...resto do codigo (Ja da pra ver aqui que o Filtro veio vazio

Codigo do Model:

namespace RELATORIO.Models
{
    public class Filtro
    {
        //Os itens que não são public ainda não estão claros no contexto
        public decimal ID { get; set; }
        public string Planta { get; set; }
        public string Item { get; set; }
        public string Equipamento { get; set; }
        public List<string> Equipamentos { get; set; }
        public decimal EquipamentoID { get; set; }
        public string Ordem { get; set; }
        public decimal OrdemID { get; set; }
        public string IntervaloData { get; set; }

Obs: Se eu tirar a referencia do ID no botao submit pra nao chamar o JS, ele passa os valores pra camada Controller sem problema, mas no List q tem multi seleções, passa apenas o primeiro item selecionado.

Agradeço se alguem puder ajudar.

1 resposta
solução!

Olá, Felippe!

Coloque o atributo de parâmetro [FromBody] no seu parâmetro de action:

public ActionResult Setup([FromBody]Filtro filtro)

Como sua requisição é POST, os dados estão indo para o servidor no corpo da requisição, então o atributo vai fazer o binding do objeto Filtro a partir do corpo (from body) da requisição.

Boa sorte e bons estudos!