none
data annotation Duvida RRS feed

  • Pergunta

  • Estou com uma duvida com data annotations, é o a seguinte:

    Tenho uma classe filho que herda da classe pai, porem a classe pai possui suas propriedades donde existem algumas propriedades com obrigatoriedade.

    Nesse casso quando dei um submit na aplicação venho o seguinte:

     if (ModelState.IsValid) "FALSE"

    esta sempre trazendo false, pq a herança me obriga a preencher uma propriedade q está na classe Pai que é obrigatorio, e não tenho a necessidade de usar essa propriedade ate o momento.

    como resolver esse problema ?

    muito obrigado.

    segunda-feira, 18 de maio de 2015 23:26

Respostas

  • Isso é normal. Quando você passa de o model de um ActionResult para outro, ele não persiste as informações. 

    O que você precisa fazer, é colocar na view, como hiddenfield, os campos que você não quer alterar, mas que são obrigatórios.

    • Marcado como Resposta _Manigold_ terça-feira, 19 de maio de 2015 12:50
    terça-feira, 19 de maio de 2015 12:39
  • Eu também achei estranho no início, mas depois você se acostuma. Você realmente precisa passar todos os valores requeridos para o ModelState ser válido.
    • Marcado como Resposta _Manigold_ terça-feira, 19 de maio de 2015 12:50
    terça-feira, 19 de maio de 2015 12:47
  • Esses valores estão preenchidos no banco de dados? verifica se na sua base de dados ou quando você passa eles pra view, eles estão preenchidos.
    • Marcado como Resposta _Manigold_ terça-feira, 19 de maio de 2015 17:49
    terça-feira, 19 de maio de 2015 14:13
  • Se é um insert, enão obrigatoriamente você precisa passar um valor pra esses campos, pois eles devem estar marcado como not null na sua base de dados.

    Nesse caso, ou você utiliza o hiddenfield pra preencher o valor de forma estática, exemplo: value="x". Ou, como são strings, você coloca eles para serem preenchidos por textbox, usando o @Html.TextBoxFor

    Caso esses campos não sejam obrigatórios, tire o required deles.

    • Marcado como Resposta _Manigold_ terça-feira, 19 de maio de 2015 17:49
    terça-feira, 19 de maio de 2015 14:25

Todas as Respostas

  • VocÊ pode colocar aqui as classes que está utilizando? fica melhor pra tentar te ajudar.
    segunda-feira, 18 de maio de 2015 23:28
  • Mais simples ainda, ou seja em minha classe financeiro tenho as propriedades, logo abaixo:

    o problema que as vezes não uso todas as propriedades, e la no meu controller ocorre o seguinte:  if (ModelState.IsValid) "FALSE" "

    Sempre vem como false,pq ele me obriga a passar um "valor" para todos que estão como "REQUIRED".

      public class FinanceiroMod 
        {

            [Required(ErrorMessage = "Grupo é obrigatório")]
            public string Grupo { get; set; }
            [Required(ErrorMessage = "Tipo é obrigatório")]
            public string FixoVariavel { get; set; }
            public string Obs { get; set; }
            public bool Situacao { get; set; }

            [Required(ErrorMessage = "Data de emissão obrigaório")]
            [Display(Name = "Data de emissão")]
            [DataType(DataType.Date, ErrorMessage = "Data em formato inválido")]
            public DateTime DataEmissao { get; set; }

            [Required(ErrorMessage = "Data de vencimento obrigatório")]
            [Display(Name = "Data de vencimento")]
            [DataType(DataType.Date, ErrorMessage = "Data em formato inválido")]
            public DateTime DataVencimento { get; set; }
            [Required(ErrorMessage = "Valor é obrigatório")]
            public decimal? Valor { get; set; }
            public int Parcela { get; set; }
            public int QdeParcela { get; set; }


        }

                                       
    • Editado _Manigold_ terça-feira, 19 de maio de 2015 12:25
    terça-feira, 19 de maio de 2015 12:22
  • Isso é normal. Quando você passa de o model de um ActionResult para outro, ele não persiste as informações. 

    O que você precisa fazer, é colocar na view, como hiddenfield, os campos que você não quer alterar, mas que são obrigatórios.

    • Marcado como Resposta _Manigold_ terça-feira, 19 de maio de 2015 12:50
    terça-feira, 19 de maio de 2015 12:39
  • Serio ?, só existe essa forma ?

    terça-feira, 19 de maio de 2015 12:41
  • Eu também achei estranho no início, mas depois você se acostuma. Você realmente precisa passar todos os valores requeridos para o ModelState ser válido.
    • Marcado como Resposta _Manigold_ terça-feira, 19 de maio de 2015 12:50
    terça-feira, 19 de maio de 2015 12:47
  • Rs,rs, blz , agradeço, mas é estranho mesmo.

    Meu muito obrigado.

    terça-feira, 19 de maio de 2015 12:49
  • Blz. Algumas vezes, eu recupero o objeto antes de dar o update e preencho com as informações passadas pela view. Quando é algo que eu não quero mesmo que seja alterado.
    terça-feira, 19 de maio de 2015 12:52
  • Alexandre nesse caso deve ser dessa forma ?

    ou eu tenho que passar algum valor null ou algo do genero ?

                                @Html.HiddenFor(x => x.FixoVariavel)
                                @Html.HiddenFor(x => x.Grupo)

    Obrigado.

    terça-feira, 19 de maio de 2015 12:57
  • Você passa o valor real deles. Exatamente dessa forma.
    terça-feira, 19 de maio de 2015 13:00
  • Puxa Alexandre fiz exatamente e ainda continua como false.

    Obrigado.

    terça-feira, 19 de maio de 2015 13:09
  • Você já viu qual é o erro que ele ta dando?
    terça-feira, 19 de maio de 2015 13:10
  • Puxa Alexandre fiz exatamente e ainda continua como false.

    Obrigado.


    terça-feira, 19 de maio de 2015 13:18
  • vem como false ainda.

    que estranho.

    terça-feira, 19 de maio de 2015 13:19
  • Observei que o Grupo e o FixoVariavel estão nulos, e são campos obrigatórios. Da um print na sua view pra ver se o erro está la.
    terça-feira, 19 de maio de 2015 13:24
  • terça-feira, 19 de maio de 2015 13:47
  • O hidden fields estão dentro do form? não vi o form.
    terça-feira, 19 de maio de 2015 13:54
  • sim estao.

    terça-feira, 19 de maio de 2015 13:57
  • sim estao.

    @model Modelo.FinanceiroMod

    <script>

        $(function () {
            $("#dataemissao,#datavencimento").datepicker({
                dateFormat: 'dd/mm/yy',
                dayNames: ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'],
                dayNamesMin: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S', 'D'],
                dayNamesShort: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb', 'Dom'],
                monthNames: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
                monthNamesShort: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
                nextText: 'Próximo',
                prevText: 'Anterior',
                mask: '9999-99-99'
            });

        });

    </script>
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <h4 class="modal-title" id="myModalLabel">Cadastro</h4>
    </div>

    @using (Html.BeginForm())
    {

        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        <div role="tabpanel">
            <!-- Nav tabs -->
            <ul class="nav nav-tabs" role="tablist">
                <li class="active"><a href="#home" aria-controls="home" role="tab" data-toggle="tab">Grupo</a></li>
            </ul>

            <!-- Tab panes -->
            <div class="tab-content">
                <div role="tabpanel" class="tab-pane active" id="home">

                    <div class="modal-body">
                        <div class="form-horizontal">

                            <div class="form-group">
                                <div class="col-sm-9">
                                    <label>Grupo</label>
                                    @Html.DropDownListFor(x => x.CodigoGrupo,
                                                             ViewBag.Grupo as SelectList, new { @id = "grupo", @class = "form-control" })
                                    
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-sm-9">
                                    <label>Descrição</label>
                                    @Html.TextBoxFor(model => model.Obs, new { @id = "obs", @class = "form-control" })
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-sm-9">
                                    <label>Valor</label>
                                    @Html.TextBoxFor(model => model.Valor, new { @id = "valor", @class = "form-control" })
                                    
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-sm-9">
                                    <label>Parcela(s)</label>
                                    @Html.TextBoxFor(model => model.Parcela, new { @id = "parcela", @class = "form-control" })
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-sm-9">
                                    <label>Qtde Parcelas</label>
                                    @Html.TextBoxFor(model => model.QdeParcela, new { @id = "qteparcela", @class = "form-control" })
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-sm-9">
                                    <label>Situação</label>
                                    @Html.DropDownListFor(model => model.Situacao, new SelectList(new List<Object>
                                    {
                                        new {Value="true", Text="Pago"},
                                        new {Value="false", Text="Não pago"},
                                    },
                                        "Value", "Text"), new { @id = "status", @class = "form-control" })
                                </div>
                            </div>
                            <div class="form-group">
                                <div class="col-sm-9">
                                    <label>Data emissão</label>
                                    @Html.TextBoxFor(model => model.DataEmissao, new { @id = "dataemissao", @onkeypress = "mascara(this,data)", @maxlength = "10", @class = "form-control" })
                                    

                                </div>

                            </div>
                            <div class="form-group">
                                <div class="col-sm-9">
                                    <label>Data vencimento</label>
                                    @Html.TextBoxFor(model => model.DataVencimento, new { @id = "datavencimento", @onkeypress = "mascara(this,data)", @maxlength = "10", @class = "form-control" })
                                    

                                </div>
                            </div>
                            <div>
                                @Html.HiddenFor(model => model.FixoVariavel, new { @value = string.Empty })
                                @Html.HiddenFor(model => model.Grupo, new { @value = string.Empty})
                                
                                
                            </div>
                        </div>

                    </div>
                </div>
            </div>
        </div>

        <div class="modal-footer">
            <span id="progress" class="text-center" style="display: none;">
                <img src="~/Content/images/loading.gif" alt="wiat" />
            </span>
            <input class="btn btn-success" type="submit" value="Salvar" />
            <button class="btn btn-danger" data-dismiss="modal">Cancelar</button>

        </div>
    }
    @Scripts.Render("~/bundles/jqueryval")


    terça-feira, 19 de maio de 2015 13:58
  • Você está passando o value ="". Retira o value = string.Empty.

    O valor tem que ser o modelFixoVariavel, por exemplo.

    terça-feira, 19 de maio de 2015 14:03
  • Desculpe, é que estou tentando varias opções rssrrs.

    Mas ja fiz sem tambem, nao deu certo.

    terça-feira, 19 de maio de 2015 14:04
  • Como vc faria ?

    obrigado.

    terça-feira, 19 de maio de 2015 14:05
  •  @Html.HiddenFor(model => model.FixoVariavel)
     @Html.HiddenFor(model => model.Grupo)



    terça-feira, 19 de maio de 2015 14:09
  • Então Alexandre fiz assim, e o retorno continua nulo.

    Q estranho.

    terça-feira, 19 de maio de 2015 14:12
  • Esses valores estão preenchidos no banco de dados? verifica se na sua base de dados ou quando você passa eles pra view, eles estão preenchidos.
    • Marcado como Resposta _Manigold_ terça-feira, 19 de maio de 2015 17:49
    terça-feira, 19 de maio de 2015 14:13
  • A base está vazia é um insert.

    terça-feira, 19 de maio de 2015 14:19
  • Se é um insert, enão obrigatoriamente você precisa passar um valor pra esses campos, pois eles devem estar marcado como not null na sua base de dados.

    Nesse caso, ou você utiliza o hiddenfield pra preencher o valor de forma estática, exemplo: value="x". Ou, como são strings, você coloca eles para serem preenchidos por textbox, usando o @Html.TextBoxFor

    Caso esses campos não sejam obrigatórios, tire o required deles.

    • Marcado como Resposta _Manigold_ terça-feira, 19 de maio de 2015 17:49
    terça-feira, 19 de maio de 2015 14:25
  • Deu certo?
    terça-feira, 19 de maio de 2015 18:09
  • Vejá aqui como você pode ignorar determinadas propriedades de sua Classe

    http://www.codigoexpresso.com.br/Home/Postagem/34



    Se foi útil e/ou resolveu seu problema, não esqueça de marcar como resposta.
    Visite : www.codigoexpresso.com.br
    terça-feira, 24 de maio de 2016 02:40
  • Desculpe agora que entendi seu problema, quando uma string vier vazia ou "" ou empty, ela vai retornar em sua classe como nula mesmo, pasta tratar e corririr o valor nulo para "" quando receber a classe modelo


    Se foi útil e/ou resolveu seu problema, não esqueça de marcar como resposta.
    Visite : www.codigoexpresso.com.br
    segunda-feira, 11 de julho de 2016 23:25