none
Ajuda com validação de dois campos (ASP MVC4) RRS feed

  • Pergunta

  • Olá, estou com problema em validar dois campos na minha aplicação MVC 4.

    Eu preciso fazer uma validação que verifique os dois campos e permita que ao menos um esteja preenchido, ou seja, não permita passar os dois campos NULL... que ao menos um esteja preenchido...

    Alguem pode me ajudar?

    quarta-feira, 18 de setembro de 2013 12:30

Respostas

  • controller
    
    namespace MvcApplication2.Controllers
    {
        public class HomeController : Controller
        {
            //
            // GET: /Home/
    
            public ActionResult Index()
            {
                return View();
            }
    
            [HttpPost]
            public ActionResult Index(TESTE teste)
            {
                if(ModelState.IsValid)
                return View();
    
                return View(teste); 
    
            }
    
    
    
        }
    }
    
    
    
    model 
    
    
     public class TESTE : IValidatableObject
        {
    
            public Int32? Product01Id { get; set; }
            public Int32? Product02Id { get; set; }
    
            public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
            {
                if (Product01Id == null && Product02Id == null)
                    yield return new ValidationResult(("Selecione pelo menos 1 produto!"));
            }
    
    
    
        }
    
    
    View
    
    @model MvcApplication2.Models.TESTE
    
    @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    <h2>Index</h2>
    
    @using (Html.BeginForm()) {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
    
        <fieldset>
            <legend>TESTE</legend>
    
            <div class="editor-label">
                @Html.LabelFor(model => model.Product01Id)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Product01Id)
                @Html.ValidationMessageFor(model => model.Product01Id)
            </div>
    
            <div class="editor-label">
                @Html.LabelFor(model => model.Product02Id)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Product02Id)
                @Html.ValidationMessageFor(model => model.Product02Id)
            </div>
    
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
    }
    
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    
    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }
    
    
    
    cria um demo ai rapido 
    
    
    
    
    
    
    
    
    
    


    • Marcado como Resposta Jones Santos quarta-feira, 18 de setembro de 2013 17:41
    quarta-feira, 18 de setembro de 2013 15:21

Todas as Respostas

  • dataannotations, na sua MODEL você pode herdar interface IvalidateObject e implemetar está validação no unico método que deve ser implmentado. Ele valida apenas server side então você deve validar no client também. Use o jquery. Outra forma é criar um data annotations é um pouco mais complexo, mas você pode usar em varios models segue um link como fazer com data annotations http://www.codeproject.com/Articles/301022/Creating-Custom-Validation-Attribute-in-MVC-3 
    quarta-feira, 18 de setembro de 2013 13:11
  • dataannotations, na sua MODEL você pode herdar interface IvalidateObject e implemetar está validação no unico método que deve ser implmentado. Ele valida apenas server side então você deve validar no client também. Use o jquery. Outra forma é criar um data annotations é um pouco mais complexo, mas você pode usar em varios models segue um link como fazer com data annotations http://www.codeproject.com/Articles/301022/Creating-Custom-Validation-Attribute-in-MVC-3 

    Então, eu tava usando essa ideia do IvalidateObject   mas de uma maneira mais simples sem necessariamentecriar uma função espeficica para isso... para tal estou utilizando algo parecido com:

    public class UserValidation : IValidatableObject
    {

    public Nullable<int> Product01Id { get; set; } public Nullable<int> Product02Id { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (Product01Id == null && ProfileScriptId == Product02Id) yield return new ValidationResult(("Selecione pelo menos 1 produto!"), new[] { "Product01Id", "Product02Id"}); }

    }

    Porém essa validação não está funcionando com o IEnumerable...

    Tem algo de errado?

    quarta-feira, 18 de setembro de 2013 14:38
  • public Int32? Product01Id { get; set; }
            public Int32? Product02Id { get; set; }

            public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
            {
                if (Product01Id == null && Product02Id == null)
                    yield return new ValidationResult(("Selecione pelo menos 1 produto!"));
            }

    funcionou bem aqui !!! olha como esta minha controler

             if(ModelState.IsValid)
                return View();

                return View(teste); 

    quarta-feira, 18 de setembro de 2013 14:47
  • public Int32? Product01Id { get; set; }
            public Int32? Product02Id { get; set; }

            public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
            {
                if (Product01Id == null && Product02Id == null)
                    yield return new ValidationResult(("Selecione pelo menos 1 produto!"));
            }

    funcionou bem aqui !!! olha como esta minha controler

             if(ModelState.IsValid)
                return View();

                return View(teste); 

    Vc fez um script de teste, se sim, poderia enviar zipado p eu testar aqui fazendo favor? 

    Valew
    quarta-feira, 18 de setembro de 2013 14:54
  • controller
    
    namespace MvcApplication2.Controllers
    {
        public class HomeController : Controller
        {
            //
            // GET: /Home/
    
            public ActionResult Index()
            {
                return View();
            }
    
            [HttpPost]
            public ActionResult Index(TESTE teste)
            {
                if(ModelState.IsValid)
                return View();
    
                return View(teste); 
    
            }
    
    
    
        }
    }
    
    
    
    model 
    
    
     public class TESTE : IValidatableObject
        {
    
            public Int32? Product01Id { get; set; }
            public Int32? Product02Id { get; set; }
    
            public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
            {
                if (Product01Id == null && Product02Id == null)
                    yield return new ValidationResult(("Selecione pelo menos 1 produto!"));
            }
    
    
    
        }
    
    
    View
    
    @model MvcApplication2.Models.TESTE
    
    @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    <h2>Index</h2>
    
    @using (Html.BeginForm()) {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
    
        <fieldset>
            <legend>TESTE</legend>
    
            <div class="editor-label">
                @Html.LabelFor(model => model.Product01Id)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Product01Id)
                @Html.ValidationMessageFor(model => model.Product01Id)
            </div>
    
            <div class="editor-label">
                @Html.LabelFor(model => model.Product02Id)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Product02Id)
                @Html.ValidationMessageFor(model => model.Product02Id)
            </div>
    
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
    }
    
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    
    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }
    
    
    
    cria um demo ai rapido 
    
    
    
    
    
    
    
    
    
    


    • Marcado como Resposta Jones Santos quarta-feira, 18 de setembro de 2013 17:41
    quarta-feira, 18 de setembro de 2013 15:21
  • Ah bacana, com o seu teste consegui fazer funfar aqui....

    Só que não está validando diretamente com o Jquery... sabe de alguma referencia que faça a validação com JQuery sem efetuar o "refresh"?

    Valew

    quarta-feira, 18 de setembro de 2013 16:33
  • Foi oq eu disse com Ivalidobject não valida com client side. Você pode fazer um script para validar clinte side use jquery
    quarta-feira, 18 de setembro de 2013 17:45
  • Você pode usar o atributo [Remote] com um campo adicional

    [Remote("ValidarDataInicioAditamento", "Alunos", ErrorMessage = "Conflito com outros contratos.", AdditionalFields = "idContrato")]




    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 03:11