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?

Foi útil?

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:)

$ (Function () { $ ( "[Readonly = 'false']") removeAttr ( "somente leitura."); });

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top