Domanda

Ho un MVC View Control fortemente tipizzato che è responsabile dell'interfaccia utente in cui gli utenti possono creare e modificare gli elementi client. Vorrei che fossero in grado di definire il ClientId al momento della creazione, ma non di modificarlo, e questo si rifletterà nell'interfaccia utente.

A tal fine, ho la seguente riga:

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, new 
 { @readonly = 
   (ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
      ? "readonly" : "false") 
 } )
%>

Sembra che indipendentemente dal valore che attribuisco all'attributo readonly (anche "false" e "quot"), Firefox e IE7 rendono l'input di sola lettura, che è fastidiosamente contro-intuitivo. Esiste un modo piacevole, basato sull'operatore ternario, di eliminare completamente l'attributo se non è richiesto?

È stato utile?

Soluzione

Problema difficile ... Tuttavia, se si desidera definire solo l'attributo in sola lettura , è possibile farlo in questo modo:

<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, 
  ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0 
    ? new { @readonly =  "readonly" } 
    : null) 
%>

Se si desidera definire più attributi, è necessario definire due tipi anonimi e disporre di più copie degli attributi. Ad esempio, qualcosa del genere (che non mi piace comunque):

ClientId.Length > 0 
  ? (object)new { @readonly = "readonly", @class = "myCSS" } 
  : (object)new { @class = "myCSS" }

Altri suggerimenti

Se desideri definire diversi attributi e condizionalmente di sola lettura senza duplicare gli altri attributi , puoi utilizzare Dizionario anziché tipi anonimi per gli attributi.

per es.

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 l'alternativa è solo emetterlo come semplice vecchio HTML. Sì, l'editor ti farà pensare che ti sbagli, ma questo sembra accadere abbastanza frequentemente con VS2008SP1. Questo esempio è specifico per le caselle di controllo che sembrano essere completamente sprecate in CTP5, ma ti dà un'idea di come emettere gli attributi condizionali.

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
  <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
  <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />

Suggerimento: è la semplice presenza di un attributo di sola lettura / disabilitato che rende l'elemento di sola lettura o disabilitato nel browser.

@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ })

Penso che dovrebbe essere

<%= ((bool) Eval("InRole")) ? "checked" : "" %> 

invece di questo nella risposta i lebbies.

<%# ((bool) Eval("InRole")) ? "checked" : "" %> 

Almeno non ha funzionato per me con # ma ha funzionato con =. Ho fatto qualcosa di sbagliato? Grazie comunque per il suggerimento :)

$ (function () {   $ (& Quot; [sola lettura = 'false'] ") removeAttr (" in sola lettura ").;  });

Uso questo:

   @Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)

Ho provato la maggior parte dei suggerimenti sopra e ora sono arrivato al più semplice con una sola riga. Combina 2 attributi anonimi html dichiarando appassire uno di essi come " oggetto " tipo.

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top