Frage

Ich habe eine stark typisierte MVC View Control, die für die Benutzeroberfläche verantwortlich ist, wo Benutzer erstellen und bearbeiten können Client-Elemente. Ich mag sie in der Lage sein, den ClientId auf Schöpfung zu definieren, aber nicht bearbeiten, und dies in der Benutzeroberfläche widerspiegelt.

Zu diesem Zweck habe ich die folgende Zeile:

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

Es scheint, dass egal, welchen Wert ich das Nur-Lese-Attribut (auch „false“ und „“) geben, Firefox und IE7 die Eingabe machen nur lesbar, die ärgerlicherweise kontraintuitiv ist. Gibt es eine nette, ternär betreiberbasierte Art und Weise das Attribut vollständig fallen zu lassen, wenn es nicht benötigt wird?

War es hilfreich?

Lösung

Tough Problem ... Wenn Sie jedoch nur das readonly Attribut definieren möchten, können Sie es wie folgt tun:

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

Wenn Sie mehrere Attribute definieren möchten, dann müssen Sie zwei anonyme Typen definieren und mehrere Kopien der Attribute. Zum Beispiel so etwas wie dies (die Ich mag sowieso nicht wichtig):

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

Andere Tipps

Wenn Sie mehrere Attribute definieren und bedingten Read-only , ohne die anderen Attribute duplizieren , Sie können Wörterbuch statt anonyme Typen für die Attribute verwenden.

z.

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)  

Und Alternative ist es einfach als die gute alte HTML zu emittieren. Ja, wird der Editor machen Sie denken, Sie sind falsch, aber das scheint mit VS2008SP1 recht häufig geschehen. Dieses Beispiel ist speziell für die Kontrollkästchen, die vollständig in CTP5 verschwendet zu sein scheinen, aber es gibt Ihnen eine Vorstellung davon, wie bedingte Attribute zu emittieren.

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

. Tipp: Es ist das bloße Vorhandensein von Nur-Lese / disabled-Attribute, das das Element nur lesbar oder deaktiviert im Browser macht

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

ich denke, es sollte

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

statt dessen in leppies beantworten.

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

Wenigstens hat es nicht für mich mit # arbeiten, aber es funktionierte mit =. Habe ich etwas falsch gemacht? Danke für den Tipp trotzdem:)

$ (Function () {   $ ( "[Read-only = 'false']") removeAttr ( "Nur-Lesen.");  });

Ich benutze diese:

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

Ich habe versucht, die meisten der oben genannten Vorschläge und jetzt habe ich am einfachsten mit einer einzigen Zeile angekommen. Kombinieren Sie 2 anonyme HTML-Attribute Objekt von welken eine davon als „Objekt“ Typ zu deklarieren.

@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top