Сохранение данных поля формы (строки) в столбце базы данных - PullRequest
0 голосов
/ 18 февраля 2020

У меня проблемы с отправкой формы и сохранением заполненных полей в моей базе данных. На самом деле, это происходит только для одного из моих полей (model.CampoExtra), которое в данном случае представляет собой список с множественным выбором (lPagamentos). Мне нужно сохранить ключи выбранных пользователем itens в моей базе данных, но когда пользователь выбирает более одного элемента, я сохраняю только один ключ (первый) и теряю остальные. Строка, содержащая выбранные ключи, имеет следующий формат: 'key1, key2, keyN, ....' . Рассматриваемый столбец, который должен получить эти значения, имеет достаточный размер, он был объявлен как [varchar] (80), поэтому я действительно не понимаю, где мне не хватает. Я поделюсь примером кода, и, надеюсь, кто-то может указать на ошибку.

Пример кода формы (просмотр)

@{


    List<SelectListItem> lPagamentos = new List<SelectListItem>();

    DropDownList DDList = new DropDownList();

    lPagamentos = DDList.GetListaCampoExtraFormasPGTO();

}

<script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
<script src="~/Scripts/select2.min.js"></script>
<link href="~/Content/CSS/select2.css" rel="stylesheet" />

<div id="Form" class="form-container @ViewBag.Acao">
        <div class="page-header">
            <h1>Cadastro de Mensagens</h1>
        </div>
        @using (Html.BeginForm(Acao, "SMS", FormMethod.Post, new { id = "FRMSms" }))
        {
            @Html.AntiForgeryToken()
            <div class="panel panel-primary">
                <div class="panel-heading">
                    <h4>Preencha com as informações do formulário!</h4>
                </div>
                <div class="panel-body">
                    @Html.HiddenFor(model => Model.MensagemID)
                    <input type="text" id="TotalFP" name="TotalFP" value="@ViewBag.TotalFP" />
                    **<!--THIS RETURNS MY DESIRED RECORD<input type="text" id="PgtoID" name="PgtoID" value="@ViewBag.PgtoID" />-->**


                    @if (Area == "MAS")
                    {
                        <div class="form-group col-md-6">
                            @Html.LabelFor(model => model.EmpresaID, htmlAttributes: new { @class = "control-label" }) <!--Cria tag Label-->
                            @Html.ValidationMessageFor(model => model.EmpresaID, "", new { @class = "text-danger" }) <!--Cria tag span-->
                            @Html.DropDownListFor(model => model.EmpresaID, (List<SelectListItem>)lEmpresas, " - SELECIONE - ", new { @class = "form-control" }) <!--Cria tag select-->
                        </div>
                    }
                    else
                    { @Html.HiddenFor(model => model.EmpresaID)}

                    <div class="form-group col-md-6 CampoForm">
                        @Html.LabelFor(model => model.Tipo, htmlAttributes: new { @class = "control-label" })
                        @Html.ValidationMessageFor(model => model.Tipo, "", new { @class = "text-danger" })
                        @Html.EditorFor(model => model.Tipo, new { htmlAttributes = new { @class = "form-control", placeholder = "Tipo" } })
                    </div>

                    <div class="form-group col-md-12 CampoForm">
                        <label for="Descricao" class="control-label">Descrição <span id="caracteres">120</span> caracteres restantes.</label>
                        @Html.EditorFor(model => model.Descricao, new { htmlAttributes = new { @class = "form-control", maxlength = 120 } })
                    </div>

                    <div class="form-group col-md-12 CampoForm">
                        <label for="Texto" class="control-label">Mensagem <span id="rchars">155</span> caracteres restantes.</label>
                        @Html.ValidationMessageFor(model => model.Texto, "", new { @class = "text-danger" })
                        @Html.TextAreaFor(model => model.Texto, new { @class = "form-control", maxlength = 155 })
                    </div>

                    <div class="form-group col-md-9 CampoForm">
                        <label for="PgtoIDD" class="control-label">Formas de Pagamento - <input type="checkbox" id="chkTodos" /> Selecionar todos</label>
                        <input type="hidden" id="PgtoID" name="PgtoID" />
                        @Html.DropDownListFor(model => model.CampoExtra, (List<SelectListItem>)lPagamentos, new { @class = "form-control mySelect2", name = "CampoExtra", multiple = "multiple", style = "width:100%;" })
                    </div>

                    <div class="form-group col-md-3 CampoForm">
                        @Html.LabelFor(model => model.Situacao, htmlAttributes: new { @class = "control-label" })
                        @Html.ValidationMessageFor(model => model.Situacao, "", new { @class = "text-danger", maxlength = 1 })
                        @Html.DropDownListFor(model => model.Situacao, (List<SelectListItem>)lSituacao, " - SELECIONE - ", new { @class = "form-control" })
                    </div>
                    <div class="form-group col-md-3 CampoForm">
                        <label class="form-label">Cadastro</label>
                        <input id="Cadastro" name="Cadastro" tabindex="-1" type="text" readonly class="form-control" value="@Cadastro" />
                    </div>

                </div>
                <div class="panel-footer">
                    <input type="submit" value="@ViewBag.Label" class="btn btn-primary"> | @Html.ActionLink("Cancelar", "../Sms/", new { id = "", acao = "" }, new { @class = "btn btn-primary" })
                </div>
            </div>
        }
    </div>

<script>    

    $("#Form #CampoExtra").select2({
        placeholder: "Selecione uma(s) forma(s) de pagamento.",
        allowClear: true,
        theme: "classic",
    });

    $("#chkTodos").on("click", function () {
        if (this.checked) {
            $("#Form #CampoExtra").select2('destroy').find('option').prop('selected', 'selected').end().select2();
            var CsID = $("#Form #CampoExtra").val();
            $("#Form #TotalFP").val("S");
            $("#PgtoID").val(CsID);
        } else {
            $("#Form #CampoExtra").select2('destroy').find('option').prop('selected', false).end().select2();
            $("#PgtoID").val('');
            $("#Form #TotalFP").val("");
        }
    })

    $("#Form #CampoExtra").on("change", function () {
        var PgtoID = $(this).val();
        $("#PgtoID").val(PgtoID);

        var isChange = ($("#Form #CampoExtra option:checked").length == $("#Form #CampoExtra option").length);
        $("#chkTodos")[0].checked = isChange;
        var TotalFP = (isChange) ? "S" : "";
        $("#Form #TotalFP").val(TotalFP);
    });

    if ('@ViewBag.PgtoID'.length > 0) {
        $("#Form #CampoExtra").val([@ViewBag.PgtoID]);
        $('#Form #CampoExtra').trigger('change');
    };

</script>

Контроллер

public ActionResult CadastrarSMS(Sms_Mensagens SmsMensagem)
        {
            bool IsLogado = (Session["IsLogado"] is null);
            if (IsLogado)
            {
                return RedirectToAction("Login", "User", new { acao = "ErroSessao" });
            };
            if (!ModelState.IsValid)
            {
                return View("FormSms", SmsMensagem);
            }

            int MensagemID = SmsMensagem.MensagemID;

            if (MensagemID == 0)
            {
                DBCtx.MensagensDB.Add(SmsMensagem);
            }
            else
            {
                DBCtx.Entry(SmsMensagem).State = EntityState.Modified;
            }

            DBCtx.SaveChanges();

            ViewModelSucesso ViewMS = new ViewModelSucesso();
            ViewMS.Controller = "SMS";
            ViewMS.View = "Index";
            return View("Sucesso", ViewMS);

        }

        public ActionResult FormSMS(int id = 0, string acao = "")
        {

            bool IsLogado = (Session["IsLogado"] is null);
            if (IsLogado)
            {
                return RedirectToAction("Login", "User", new { acao = "ErroSessao" });
            };
            ViewBag.Id = id;
            ViewBag.Acao = acao;

            ViewBag.Label = "Cadastrar";
            if (acao == "Editar") { ViewBag.Label = "Atualizar"; };
            if (id == 0)
            {
                ViewBag.EmID = 0;
                ViewBag.FiID = 0;
                return View();
            }

            Sms_Mensagens SmsMensagem = DBCtx.MensagensDB.Find(id);
            ViewBag.EmID = SmsMensagem.EmpresaID;

            if (SmsMensagem == null)
            {
                return View();
            }
            return View(SmsMensagem);
        } 

Модель

public class Sms_Mensagens
    {

        [Key]
        [Display(Name = "ID Mensagem")]
        public int MensagemID { get; set; }

        [Display(Name = "Empresa")]
        public int EmpresaID { get; set; }

        public string Tipo { get; set; }

        [Required(ErrorMessage = " - Preencha a descrição da mensagem!")]
        [Display(Name = "Descrição (até 120 caracteres)")]
        public string Descricao { get; set; }

        [Required(ErrorMessage = " - Descreva o texto da mensagem")]
        [MaxLength(155, ErrorMessage = " - O texto deve conter até {1} caracteres.")]
        [Display(Name = "Mensagem (até 155 caracteres)")]
        public string Texto { get; set; }

        [Required(ErrorMessage = " - Selecione uma ou mais areas!")]
        [Display(Name = "Areas")]
        public string CampoExtra { get; set; }

        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy HH:mm:ss}", ApplyFormatInEditMode = true)]
        public DateTime Cadastro { get; set; }

        [Required(ErrorMessage = " - Selecione a Situação")]
        [Display(Name = "Situação")]

        public string Situacao { get; set; }
        public virtual Empresas Empresas { get; set; }

    }

public List<SelectListItem> GetListaCampoExtraFormasPGTO()
        {
            List<SelectListItem> Lista = new List<SelectListItem>();
            var data = new[]{
                new SelectListItem{Value = "CC", Text = "CARTÃO DE CRÉDITO" },
                new SelectListItem{Value = "BB", Text = "BOLETOS" },
                new SelectListItem{Value = "DC", Text = "DÉBITO EM CONTA" },
                new SelectListItem{Value = "TE", Text = "TRANSFERÊNCIA ELETRÔNICA" },
                new SelectListItem{Value = "CE", Text = "CONTA DE ENERGIA" },
                new SelectListItem{Value = "CT", Text = "CONTA DE TELEFONE" }
            };
            Lista = data.ToList();
            return Lista;
        }

1 Ответ

2 голосов
/ 18 февраля 2020

Когда ваша форма отправлена, выбранные параметры из выпадающего списка CampoExtra отправляются по одному. Таким образом, тело вашего запроса будет содержать что-то вроде этого:

CampoExtra=key1&CampoExtra=key2&CampoExtra=key3

Ваш Sms_Mensagens.CampoExtra имеет строковый тип, поэтому он принимает одну строку. Попробуйте изменить это свойство на тип IEnumerable<string> или string[]. Конечно, вам придется присоединиться к выбранным параметрам вручную (string.Join(",", SmsMensagem.CampoExtra)), чтобы сохранить их как одно значение в БД.

Обратите внимание, что не рекомендуется хранить запятую. разделенные значения в одном столбце (по крайней мере, в реляционной базе данных), возможно, лучше нормализовать ваши таблицы.

...