2013-08-29 2 views
8

Das Attribut ReadOnly scheint nicht in MVC 4 zu sein. Das Attribut Editable (false) funktioniert nicht so, wie ich es möchte.MVC 4 Rasierklinge Data Annotations ReadOnly

Gibt es etwas Ähnliches, das funktioniert?

Wenn nicht, dann wie kann ich meine eigene Readonly-Attribut zu machen, die wie folgt funktionieren würde:

public class aModel 
{ 
    [ReadOnly(true)] or just [ReadOnly] 
    string aProperty {get; set;} 
} 

so kann ich dies gesagt:

@Html.TextBoxFor(x=> x.aProperty) 

statt dessen (die Arbeit der Fall ist):

@Html.TextBoxFor(x=> x.aProperty , new { @readonly="readonly"}) 

oder diese (was funktioniert, aber Werte werden nicht vorgelegt):

@Html.TextBoxFor(x=> x.aProperty , new { disabled="disabled"}) 

http://view.jquerymobile.com/1.3.2/dist/demos/widgets/forms/form-disabled.html

so etwas wie vielleicht das? https://stackoverflow.com/a/11702643/1339704

Hinweis:

[Editierbare (false)] hat nicht funktioniert

Antwort

9

Sie können einen benutzerdefinierten Helfer wie diese erstellen, die die Eigenschaft für das Vorhandensein eines ReadOnly Attribut überprüfen wird:

public static MvcHtmlString MyTextBoxFor<TModel, TValue>(
    this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) 
{ 
    var metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 
    // in .NET 4.5 you can use the new GetCustomAttribute<T>() method to check 
    // for a single instance of the attribute, so this could be slightly 
    // simplified to: 
    // var attr = metaData.ContainerType.GetProperty(metaData.PropertyName) 
    //     .GetCustomAttribute<ReadOnly>(); 
    // if (attr != null) 
    bool isReadOnly = metaData.ContainerType.GetProperty(metaData.PropertyName) 
           .GetCustomAttributes(typeof(ReadOnly), false) 
           .Any(); 

    if (isReadOnly) 
     return helper.TextBoxFor(expression, new { @readonly = "readonly" }); 
    else 
     return helper.TextBoxFor(expression); 
} 

Das Attribut ist einfach:

public class ReadOnly : Attribute 
{ 

} 

Ein Beispiel Modell:

public class TestModel 
{ 
    [ReadOnly] 
    public string PropX { get; set; } 
    public string PropY { get; set; } 
} 

Ich habe verifiziert, dass dies mit dem folgenden Rasierer Code funktioniert:

@Html.MyTextBoxFor(m => m.PropX) 
@Html.MyTextBoxFor(m => m.PropY) 

die als rendert:

<input id="PropX" name="PropX" readonly="readonly" type="text" value="Propx" /> 
<input id="PropY" name="PropY" type="text" value="PropY" /> 

Wenn Sie Sie leicht benötigen disabled statt readonly entsprechend den Helfer ändern können.

+0

Gibt es eine Möglichkeit, es mit jedem HTML-Helfer arbeiten zu lassen, anstatt einen neuen HTML-Helfer zu erstellen? – Soenhay

+0

Es gibt keine Möglichkeit, mit allen Helfern so zu arbeiten, wie Sie wollen. Aus diesem Grund haben die meisten Helfer das optionale 'htmlAttributes'-Argument, mit dem Sie Dinge wie 'readonly' nach Bedarf angeben können. Meine obige Lösung ist, wie Sie es für die Anforderungen implementieren müssten, die Sie gaben, d. H. Mit einem Attribut. Eine andere Lösung, obwohl ich nicht glaube, dass es sauberer wäre als die Angabe von '@readonly =" readonly "', wäre es, eine Erweiterung zu erstellen, um am ausgegebenen HTML vom Helfer zu arbeiten, zB '@ Html.TextBoxFor(). Readonly() '. – asymptoticFault

+0

Ok, ich habe mich entschieden, einfach htmlAttributes zu verwenden, da es viel einfacher ist ... aber ich werde deine Antwort akzeptieren, da es die nächste Antwort auf meine Frage zu sein scheint. – Soenhay

5

Sie Ihre eigene HTML-Helper erstellen könnten Methode

Siehe hier: Creating Customer Html Helpers

Eigentlich - check out this answer

public static MvcHtmlString MyTextBoxFor<TModel, TProperty>(
     this HtmlHelper<TModel> helper, 
     Expression<Func<TModel, TProperty>> expression) 
    { 
     return helper.TextBoxFor(expression, new { @readonly="readonly" }) 
    } 
+0

Das sieht vielversprechend aus ... Ich könnte nur eine namens ReadOnlyTextBoxFor oder etwas ähnliches erstellen .... Ich nehme an, die Daten Annotation ist Overkill. – Soenhay

+0

Genau, und meiner Meinung nach tun Sie es so, Sie tun es am richtigen Ort. Ich glaube nicht, dass eine Datenannotation ist, wie Sie definieren würden, was im Wesentlichen ein Präsentationsattribut ist. – KerSplosh

+0

Datenanmerkungen können und bieten oft Informationen zum Anzeigen einer Eigenschaft, d. H. Die "Display" - und "DisplayFormat" -Datenanmerkungen. – asymptoticFault