Como faço para enviar entrada desabilitada no ASP.NET MVC?

108

Como faço para enviar entrada desabilitada no ASP.NET MVC?

Sanchitos
fonte
3
Geralmente, você precisa formular sua pergunta como uma pergunta e postar a resposta separadamente. Votação para fechar; recomendo que você mova a parte da 'resposta' para uma resposta real.
George Stocker
1
Eu acredito que o post @Dhaval é exatamente a resposta por causa da palavra desativada em sua pergunta.
QMaster de

Respostas:

160

Você não pode fazer o campo em readonly="readonly"vez de disabled="disabled"? Um valor de campo somente leitura será enviado ao servidor, embora ainda não seja editável pelo usuário. No SELECTentanto, uma tag é uma exceção.

Darin Dimitrov
fonte
1
somente leitura funciona, mas não esmaece o campo. Aqui está um exemplo que estou usando: <%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %>como posso torná-lo cinza de forma que pareça que não é editável? Melhor ainda, podemos usar algo semelhante ao LabelFor, eu tentei LabelFor, mas ele só obtém o DisplayName ....
VoodooChild
22
4 anos fazendo .net asp e eu nunca soube que entradas desativadas não recebem mensagens de volta ... como isso me passou? Basta incluir um campo Oculto para a seleção desativada e está tudo classificado. (Mesmo que os IDs sejam repetidos no formulário, o que não é permitido)
Piotr Kula
5
Isso também não funciona para type="checkbox"entradas
Nathan
1
Estou tentando fazer a mesma coisa com os botões de opção, mas o modo somente leitura não parece funcionar neles.
Randy R
38

Obrigado a todos:

A maneira como resolvi isso:

document.getElementById("Costo").readOnly = true;
document.getElementById("Costo").style.color = "#c0c0c0";

Nota:

Consegui essa informação na resposta, mas fui editada.

Sanchitos
fonte
1
Isso não funcionou muito bem para mim (descobri graças a este link do SO ). Funcionou: textBox.Attributes.Add("readonly", "readonly");e a explicação está no link
brian-d
Que bom que você editou, pois faz mais sentido para mim.
Yawar
somente leitura parece ser o caminho a percorrer. Não faz coisas estranhas como não colocar o controle de volta, mas não permite editá-lo. Muchas Gracias!
Mariusz
Para adicionar ao comentário de Michael Brennt, se você estiver usando jQuery, a segunda linha se torna $("#textBoxId").css("color", "#c0c0c0").
F1Krazy
30

@ppumkin mencionou isso em seu comentário sobre esta resposta, mas eu queria destacá-lo, pois não consegui encontrar outros recursos sobre o envio de dados de um deficiente <select>. Também acredito que seja relevante para a questão, pois os selects não são <input>s, mas são "entradas" s.

Basta incluir um campo Oculto para a seleção desativada e está tudo classificado.

Exemplo:

@Html.DropDownListFor(model => model.SelectedID, ... , new { disabled = "disabled"}) @* Won't be posted back *@
@Html.HiddenFor(model => model.SelectedID) @* Will be posted back *@

Cuidado: isso colocará duas tags na página com o mesmo ID, o que não é um HTML válido e pode causar dores de cabeça com javascript. Para mim, eu tenho javascript para definir o valor da lista suspensa por seu html id, e se você colocar o campo oculto primeiro, o javascript encontrará isso em vez de select.

DLeh
fonte
20

Normalmente, se eu tiver um campo que é "somente leitura", mas precisa ser enviado de volta ao servidor, desabilitarei a exibição (ou simplesmente texto), mas adicionarei um campo oculto com o mesmo nome. Você ainda precisa se certificar de que o campo não foi realmente modificado no lado do servidor - apenas não atualize a partir do modelo em sua ação - mas o estado do modelo ainda será preciso se houver erros.

Tvanfosson
fonte
Sim, estava pensando em fazer o que você está sugerindo. Mas eu teria que lidar com mais variáveis. Estou torcendo para que meu post apareça no google e as pessoas não terão que sofrer, procurando uma solução fácil.
Sanchitos
4
Um problema com a sua solução é que ele quebra se o javascript estiver desabilitado. A injeção do campo oculto no lado do servidor não apresenta esse problema.
tvanfosson
15

Você também pode usar um código como este antes do envio do formulário:

$(":disabled", $('#frmMain')).removeAttr("disabled");
Dhaval Pankhaniya
fonte
2
Eu usei isso, não preciso se preocupar com elementos ocultos, não tenho certeza se há alguma desvantagem, exceto talvez um pequeno atraso na postagem de volta devido à função js
IronHide
2
Contra muitas das respostas que mencionaram sobre o uso de somente leitura em vez de desativado, acredito que em muitos casos precisamos usar desativado, li cerca de 15 respostas em perguntas semelhantes e escolhi isso apenas com o próprio filtro jQuery para selecionar os elementos apropriados para remover o atributo desativado, ótimo obrigado.
QMaster de
E se você estiver enviando com Ajax.BeginForm?
markzzz
use OnBegin " msdn.microsoft.com/en-us/library/… "
Dhaval Pankhaniya
1
parece um pouco estranho, mas foi a única solução que funcionou para mim ...
AGuyCalledGerald
8

Por design, os navegadores não suportam isso.

Faça-os readonlyque permitam enviar valores ao servidor ou, se você estiver lidando com controles que ainda podem ser usados ​​com readonlyatributos como Selecionar, adicione o estilo css pointer-events: none;para torná-los não interativos

Tipo de hack, mas funciona! Também funciona quando você está enviando o formulário diretamente com o botão de envio, sem usar javascript. Nenhum trabalho extra necessário!

Por exemplo:

<select asp-for="TypeId" 
   asp-items="@(new SelectList(await TypeRepository.FetchTypesAsync(), "TypeId", "Name"))"
   class="form-control form-control-sm" 
   readonly 
   style="pointer-events: none;">
</select>
Dave
fonte
6

Você pode criar um modelo de editor como o abaixo

CSS

.disabled {
    background-color:lightgray;
}

Modelo de Editor

@model string
@Html.TextBoxFor(x => x,new {@class="disabled", @readonly=true })
joetinger
fonte
1

expandindo Tasos '(": disabled", $ (' # xxxForm ')). removeAttr ("disabled"); você pode usar:

$("#xxxForm").submit(function (e) {
    e.preventDefault();
    var form = this;
    $('#Field1')[0].disabled = false;
    $('#Field2')[0].disabled = false;
    ...
    $('#FieldN')[0].disabled = false;
    form.submit(); // submit bypassing the jQuery bound event
});
sabor
fonte
1

Isso ajudará a enviar valores de modelo em ASP.net:

$("#iD").attr("style", "pointer-events: none;background-color:rgb(220,220,220)");
Rohan
fonte
1
Por favor formatar sua resposta . isso o torna mais legível para todos
Tarick Welling
0

Eu costumo usar essa forma para CheckBox ou CheckBoxFor porque desabilitar está causando a perda do valor. Readonly também não funciona na caixa de seleção.

@Html.DisplayFor(m => m.Order.Transfer)
@Html.HiddenFor(m => m.Order.Transfer)
Mehmet Taha Meral
fonte
0

Basta colocar este script em scripts @section em sua página. isso habilitará entradas quando você enviar a página, e você deve redirecionar o usuário para outra página após o envio.

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js">
$("form").submit(function () {
                    if ($('form').valid()) {
                        $("input").removeAttr("disabled");
                    }
                });
</script>

Ahmed Mahmoud AbdElbaset
fonte
-3

Basta tornar essa propriedade [Obrigatório] no ViewModel vinculado a essa visualização.

Kuroge
fonte