Respostas:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
Você pode criar um HTML Helper para isso, mas é simplesmente um atributo HTML como qualquer outro. Você faria um HTML Helper para uma caixa de texto com outros atributos?
@
. Normalmente, você só o verá com palavras-chave que correspondam a atributos HTML (como somente leitura, classe etc.)
@
para usar atributos que correspondam a palavras-chave C # .
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly", @class="form-control" })
ATUALIZAÇÃO: Agora é muito simples adicionar atributos HTML aos modelos de editor padrão. Isso significa em vez de fazer isso:
@Html.TextBoxFor(m => m.userCode, new { @readonly="readonly" })
você simplesmente pode fazer isso:
@Html.EditorFor(m => m.userCode, new { htmlAttributes = new { @readonly="readonly" } })
Benefícios: Você não tem que ligar .TextBoxFor
, etc. para modelos. Basta ligar .EditorFor
.
Embora a solução do @Shark funcione corretamente, e seja simples e útil, minha solução (que uso sempre) é esta: Criar um editor-template
que possa manipular o readonly
atributo :
EditorTemplates
em~/Views/Shared/
PartialView
chamadaString.cshtml
Preencha o String.cshtml
com este código:
@if(ViewData.ModelMetadata.IsReadOnly) {
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
new { @class = "text-box single-line readonly", @readonly = "readonly", disabled = "disabled" })
} else {
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
new { @class = "text-box single-line" })
}
Na classe de modelo, coloque o [ReadOnly(true)]
atributo nas propriedades que você deseja readonly
.
Por exemplo,
public class Model {
// [your-annotations-here]
public string EditablePropertyExample { get; set; }
// [your-annotations-here]
[ReadOnly(true)]
public string ReadOnlyPropertyExample { get; set; }
}
Agora você pode usar a sintaxe padrão do Razor simplesmente:
@Html.EditorFor(m => m.EditablePropertyExample)
@Html.EditorFor(m => m.ReadOnlyPropertyExample)
O primeiro renderiza um normal text-box
assim:
<input class="text-box single-line" id="field-id" name="field-name" />
E o segundo irá renderizar;
<input readonly="readonly" disabled="disabled" class="text-box single-line readonly" id="field-id" name="field-name" />
Você pode usar esta solução para qualquer tipo de dados ( DateTime
, DateTimeOffset
, DataType.Text
, DataType.MultilineText
e assim por diante). Basta criar um editor-template
.
A solução com TextBoxFor está OK, mas se você não quiser ver o campo como EditBox estiloso (pode ser um pouco confuso para o usuário), envolva as seguintes alterações:
Código do Razor antes das mudanças
<div class="editor-field">
@Html.EditorFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
Depois das mudanças
<!-- New div display-field (after div editor-label) -->
<div class="display-field">
@Html.DisplayFor(model => model.Text)
</div>
<div class="editor-field">
<!-- change to HiddenFor in existing div editor-field -->
@Html.HiddenFor(model => model.Text)
@Html.ValidationMessageFor(model => model.Text)
</div>
Geralmente, esta solução impede que o campo seja editado, mas mostra o valor dele. Não há necessidade de modificações por trás do código.
Com os créditos da resposta anterior de @Bronek e @Shimmy:
É como se eu tivesse feito a mesma coisa no ASP.NET Core:
<input asp-for="DisabledField" disabled="disabled" />
<input asp-for="DisabledField" class="hidden" />
A primeira entrada é somente leitura e a segunda passa o valor para o controlador e fica oculta. Espero que seja útil para alguém que trabalha com ASP.NET Core.
@Html.TextBox("Receivers", Model, new { @class = "form-control", style = "width: 300px", @readonly = "readonly" })
@Html.TextBoxFor(model => model.IsActive, new { readonly= "readonly" })
Isso é adequado para caixa de texto. No entanto, se você tentar fazer o mesmo para o checkbox
, tente usar isto se estiver usando:
@Html.CheckBoxFor(model => model.IsActive, new { onclick = "return false" })
Mas não use disable
, porque desabilitar sempre envia o valor padrão false
para o servidor - ou estava no estado marcado ou não. E readonly
não funciona para a caixa de seleção e radio button
. readonly
só funciona para text
campos.
Você pode usar o código a seguir para criar um TextBox como somente leitura.
Método 1
@Html.TextBoxFor(model => model.Fields[i].TheField, new { @readonly = true })
Método 2
@Html.TextBoxFor(model => model.Fields[i].TheField, new { htmlAttributes = new {disabled = "disabled"}})
@
prefixo dareadonly
propriedade. Veja minha edição.