Html.TextBox atributo condicional com ASP.NET MVC Preview 5
-
05-07-2019 - |
Pergunta
Eu tenho um MVC View Control fortemente tipado que é responsável pela interface do usuário onde os usuários podem criar e editar itens do cliente. Eu gostaria que eles sejam capazes de definir o ClientId
na criação, mas não editar, e isso se reflicta na interface do usuário.
Para este fim, eu tenho a seguinte linha:
<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, new
{ @readonly =
(ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0
? "readonly" : "false")
} )
%>
Parece que não importa o valor que eu dar o atributo somente leitura (mesmo "falsa" e ""), Firefox e IE7 fazem a entrada somente de leitura, que é irritantemente contra-intuitivo. Existe uma agradável,-ternários-operador baseado maneira de eliminar o atributo completamente se não é necessário?
Solução
problema difícil ... No entanto, se você quiser definir apenas o atributo readonly
, você pode fazê-lo como este:
<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId,
ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0
? new { @readonly = "readonly" }
: null)
%>
Se você quiser definir mais atributos, em seguida, você deve definir dois tipos anônimos e ter várias cópias dos atributos. Por exemplo, algo como isto (o que eu não gosto de qualquer maneira):
ClientId.Length > 0
? (object)new { @readonly = "readonly", @class = "myCSS" }
: (object)new { @class = "myCSS" }
Outras dicas
Se você quiser definir vários atributos, e condicional somente leitura sem duplicados os outros atributos , você pode usar dicionário, em vez de tipos anônimos para os atributos.
por exemplo.
Dictionary<string, object> htmlAttributes = new Dictionary<string, object>();
htmlAttributes.Add("class", "myCSS");
htmlAttributes.Add("data-attr1", "val1");
htmlAttributes.Add("data-attr2", "val2");
if (Model.LoggedInData.IsAdmin == false)
{
htmlAttributes.Add("readonly", "readonly");
}
@:User: @Html.TextBoxFor(
m => m.User,
htmlAttributes)
E alternativa é apenas para emiti-lo como HTML simples velho. Sim, o editor vai fazer você pensar que você está errado, mas que parece acontecer com bastante frequência com VS2008SP1. Este exemplo é especificamente para caixas de seleção que parece ser completamente perdido em CTP5, mas ela lhe dá uma idéia de como a emitir atributos condicionais.
<input type="checkbox" name="roles" value='<%# Eval("Name") %>'
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
<%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />
Dica:. Sua simples presença de somente leitura atributo / desativado que faz com que o elemento de somente leitura ou desativado no navegador
@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ })
Eu acho que deveria ser
<%= ((bool) Eval("InRole")) ? "checked" : "" %>
Em vez disso, em resposta leppies.
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
Pelo menos não funcionou para mim com #, mas ele trabalhou com =. Eu fiz algo errado? Obrigado pela dica de qualquer maneira:)
Eu uso este:
@Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)
Eu tentei a maioria das sugestões acima e agora eu ter chegado ao mais simples com uma única linha. Combine 2 html anônima atributos do objeto, declarando murchar um dele como tipo "objeto".
@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)