Eu queria saber se é possível desativar o atributo de validação necessária em determinadas ações do controlador. Estou pensando isso, porque em um dos meus formulários de edição não exijo que o usuário insira valores para os campos que eles já especificaram anteriormente. No entanto, implemento a lógica de que, quando eles inserem um valor, ela usa alguma lógica especial para atualizar o modelo, como hash de um valor etc.
Alguma sugestão de como contornar esse problema?
EDIT:
E sim, a validação do cliente é um problema aqui, pois não permitirá que eles enviem o formulário sem inserir um valor.
c#
asp.net-mvc
asp.net-mvc-3
data-annotations
Alex Hope O'Connor
fonte
fonte
RequiredAttr
completamente e fazer uma verificação no servidor quando necessário. Mas isso seria complicado no clienteRespostas:
Esse problema pode ser facilmente resolvido usando os modelos de exibição. Os modelos de exibição são classes especificamente adaptadas às necessidades de uma determinada exibição. Por exemplo, no seu caso, você pode ter os seguintes modelos de exibição:
que será usado em suas ações correspondentes do controlador:
fonte
Update(FormCollection collection)
, pelo menos eu nunca. Eu sempre definir e utilizar um modelo de visão específica:Update(UpdateViewView model)
.Insert
. Obrigado por apontar isso.Se você quiser apenas desativar a validação para um único campo no lado do cliente, poderá substituir os atributos de validação da seguinte maneira:
fonte
@Html.TexBoxFor(model => model.SomeValue, new { data_val = false })
- mais fácil de ler IMO.$(".search select").attr('data-val', false);
Eu sei que esta pergunta foi respondida há muito tempo e a resposta aceita realmente fará o trabalho. Mas há uma coisa que me incomoda: ter que copiar dois modelos apenas para desativar uma validação.
Aqui está a minha sugestão:
Dessa forma, você não precisa se preocupar com as validações do lado do cliente / servidor, a estrutura se comportará da maneira que deveria. Além disso, se você definir um
[Display]
atributo na classe base, não precisará redefini-lo no seuUpdateModel
.E você ainda pode usar essas classes da mesma maneira:
fonte
Você pode remover toda a validação de uma propriedade com o seguinte na ação do seu controlador.
@ Comentário de Ian sobre MVC5
Ainda é possível o seguinte
É irritante que você perca a digitação estática com a API atualizada. Você pode conseguir algo semelhante à maneira antiga, criando uma instância do auxiliar HTML e usando os métodos NameExtensions .
fonte
ModelState
que corresponda a essa assinatura. Não no MVC 5, pelo menos.Lado do cliente Para desativar a validação de um formulário, várias opções baseadas em minha pesquisa são fornecidas abaixo. Espero que um deles funcione para você.
Opção 1
Eu prefiro isso, e isso funciona perfeitamente para mim.
e invocando como
opção 2
Opção 3
Opção 4
Opção 5
Lado do servidor
Crie um atributo e marque seu método de ação com esse atributo. Personalize isso para se adaptar às suas necessidades específicas.
Uma abordagem melhor foi descrita aqui Ativar / Desativar validação do lado do servidor mvc dinamicamente
fonte
Pessoalmente, eu tenderia a usar a abordagem que Darin Dimitrov mostrou em sua solução. Isso libera você para poder usar a abordagem de anotação de dados com validação E ter atributos de dados separados em cada ViewModel correspondente à tarefa em questão. Para minimizar a quantidade de trabalho para copiar entre o modelo e o viewmodel, consulte o AutoMapper ou o ValueInjecter . Ambos têm seus pontos fortes individuais, então verifique os dois.
Outra abordagem possível para você seria derivar seu viewmodel ou modelo de IValidatableObject. Isso fornece a opção de implementar uma função Validar. Na validação, você pode retornar uma lista de elementos ValidationResult ou emitir um retorno de rendimento para cada problema detectado na validação.
O ValidationResult consiste em uma mensagem de erro e uma lista de cadeias com os nomes de campo. As mensagens de erro serão mostradas em um local próximo ao (s) campo (s) de entrada.
fonte
A maneira mais limpa aqui, acredito, será desabilitar a validação do lado do cliente e, no lado do servidor, você precisará:
Parece que mesmo um modelo de visualização personalizado aqui não resolve o problema porque o número desses campos 'pré-respondidos' pode variar. Se não o fizerem, um modelo de visualização personalizado pode ser a maneira mais fácil, mas usando a técnica acima, você poderá solucionar seus problemas de validação.
fonte
essa foi a resposta de outra pessoa nos comentários ... mas deve ser uma resposta real:
$("#SomeValue").removeAttr("data-val-required")
testado no MVC 6 com um campo com o
[Required]
atributoresposta roubada de https://stackoverflow.com/users/73382/rob acima
fonte
Eu estava com esse problema ao criar uma visualização de edição para o meu modelo e quero atualizar apenas um campo.
Minha solução para uma maneira mais simples é colocar os dois campos usando:
Comentários é o campo que eu atualizo apenas na Visualização de Edição, que não possui Atributo Requerido.
Entidade do ASP.NET MVC 3
fonte
AFAIK, você não pode remover o atributo em tempo de execução, mas apenas alterar seus valores (ou seja: readonly true / false) procure aqui algo semelhante . Como outra maneira de fazer o que você deseja, sem mexer nos atributos, irei com um ViewModel para sua ação específica, para que você possa inserir toda a lógica sem interromper a lógica necessária para outros controladores. Se você tentar obter algum tipo de assistente (um formulário de várias etapas), poderá serializar os campos já compilados e, com o TempData, acompanhá-los nas etapas. (para obter ajuda na serialização de desserialização, você pode usar futuros do MVC )
fonte
O que @Darin disse é o que eu recomendaria também. No entanto, eu acrescentaria a ele (e em resposta a um dos comentários) que você também pode usar esse método para tipos primitivos como bit, bool e até estruturas como Guid, simplesmente tornando-os anuláveis. Depois de fazer isso, o
Required
atributo funcionará conforme o esperado.fonte
A partir do MVC 5, isso pode ser facilmente alcançado adicionando-o ao seu
global.asax
.fonte
Eu estava procurando uma solução em que eu possa usar o mesmo modelo para inserir e atualizar na API da Web. Na minha situação, isso é sempre um conteúdo corporal. Os
[Requiered]
atributos devem ser ignorados se for um método de atualização. Na minha solução, você coloca um atributo[IgnoreRequiredValidations]
acima do método. É o seguinte:O que mais precisa ser feito? Um próprio BodyModelValidator deve ser criado e adicionado na inicialização. Isso está no HttpConfiguration e fica assim:
config.Services.Replace(typeof(IBodyModelValidator), new IgnoreRequiredOrDefaultBodyModelValidator());
Meu próprio BodyModelValidator é derivado do DefaultBodyModelValidator. E eu descobri que tive que substituir o método 'ShallowValidate'. Nesta substituição, filtrei os validadores de modelo exigidos. E agora a classe IgnoreRequiredOrDefaultBodyModelValidator e a classe de atributo IgnoreRequiredValidations:
Fontes:
string debug = new StackTrace().ToString()
para descobrir quem está lidando com a validação do modelo.fonte
Se você não quiser usar outro ViewModel, poderá desativar as validações do cliente na exibição e também remover as validações no servidor para as propriedades que deseja ignorar. Verifique esta resposta para obter uma explicação mais profunda https://stackoverflow.com/a/15248790/1128216
fonte
No meu caso, o mesmo modelo foi usado em muitas páginas para fins de reutilização. Então, o que eu fiz foi criar um atributo personalizado que verifica exclusões
e no seu controlador
Digamos que o modelo é
fonte
Sim, é possível desativar o Atributo necessário. Crie seu próprio atributo de classe personalizada (código de exemplo chamado ChangeableRequired) na extensão de RequiredAtribute e adicione uma Disabled Property e substitua o método IsValid para verificar se está desbalanceado. Use a reflexão para definir o poperty desativado, da seguinte maneira:
Atributo personalizado:
Atualize sua propriedade para usar seu novo atributo personalizado:
onde você precisa desativar a propriedade, use a reflexão para defini-la:
Isso é agradável e limpo?
Nota: a validação acima será desativada enquanto a instância do seu objeto estiver ativa \ ativa ...
fonte