2012-12-21 8 views
6

Ich versuche herauszufinden, ob es eine Möglichkeit gibt, um sicherzustellen, dass nur numerische Eingaben mit Hilfe von Data Annotations und Entity Framework möglich sind.Wie mache ich ein Eingabefeld, um Zahlen nur mit EF und Datenannotationen zu erlauben?

Ich verwende den folgenden Code

[Required] 
[DisplayName("Client No")] 
[Column("client_no", TypeName = "smallint")] 
public virtual Int16 Number { get; set; } 

Ich möchte diese mit den Ziffernklasse angezeigt werden.

In einem Ort, den ich verwenden Sie die folgende

<input type="number" name="searchClientNo" class="numericOnly" /><br /> 

aber in dem Anmeldeformular Ich bin mit

@Html.EditorFor(m => m.Number, EditorTemplate.TextBox) 

wo ich eine benutzerdefinierte haben gemacht EditorFor mit dem folgenden Code

<div class="editor-label"> 
    @Html.Label((ViewData.ModelMetadata.DisplayName??ViewData.ModelMetadata.PropertyName), 
     new Dictionary<string, object> 
      { 
       { "for", ViewData.ModelMetadata.PropertyName } 
      }) 
</div> 
<div class="editor-field"> 
    @Html.TextBox("", (object)Model, 
     new Dictionary<string, object> 
      { 
       { "id", ViewData.ModelMetadata.PropertyName }, 
       { "name", ViewData.ModelMetadata.PropertyName }, 
       { "class", "text-box single-line"}, 
       { "data-bind", "value: " + ViewData.ModelMetadata.PropertyName }, 
      }) 
    @Html.ValidationMessage(ViewData.ModelMetadata.PropertyName, 
     new Dictionary<string, object> 
      { 
       { "data-valmsg-for", ViewData.ModelMetadata.PropertyName } 
      }) 
</div> 

Ich frage mich, wie kann ich diesen Code ohne Änderungen behalten, aber immer noch die numerische nur Textfeld verwenden. Muss ich UIHint verwenden?

Oder alternativ, ist es möglich, meine bestehenden EditorFor klüger?

Ich fand diesen Blogpost http://robseder.wordpress.com/2012/06/01/uihint-displaytemplates-and-editortemplates-in-mvc/, aber ich benutze bereits einen benutzerdefinierten EditorFor. Vielleicht muss ich einen neuen Typ hinzufügen, sagen wir EditorTemplate.NumericTextBox und einen weiteren Editor hinzufügen? Das hört sich so an, als könnte es funktionieren, ich werde das morgen versuchen ...

Vielen Dank im Voraus.

Antwort

9

Sie einen benutzerdefinierten Editor-Vorlage ~/Views/Shared/EditorTemplates/NumberTemplate.cshtml schreiben konnte:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { type = "number" }) 

und dann schmücken Sie Ihre Ansicht Modell Eigenschaft mit dem UIHint Attribut:

[Required] 
[DisplayName("Client No")] 
[Column("client_no", TypeName = "smallint")] 
[UIHint("NumberTemplate")] 
public virtual Int16 Number { get; set; } 

und innerhalb Ihrer Ansicht:

@Html.EditorFor(x => x.Number) 

oder wenn Sie dienicht verwenden möchtenAttribut auf Ihrer Ansicht nach Modell können Sie EditorTemplate.NumericTextBox = "NumberTemplate" definieren und dann:

@Html.EditorFor(m => m.Number, EditorTemplate.NumericTextBox) 
+0

Hallo Darin, Dies ist die Lösung, die ich dachte, zu implementieren, aber möchte fragen, ob es innerhalb eines bestimmten EditorFor (mein generischer tetxbox-Typ) möglich ist, irgendwie die Entscheidung basierend auf Typ des Modells zu treffen? Ich habe meinen aktuellen Code in die Frage eingefügt. – Naomi

+0

und ich benutze @ Html.TextBox und stelle die Eigenschaften zur Verfügung, aber wie sieht der Code aus, wenn ich stattdessen versuche, ? – Naomi

+0

Darin, Ich habe noch einige verwandte Fragen. Ich habe folgendes implementiert: @ Html.TextBox ("", ViewData.TemplateInfo.FormattedModelValue, neu {type = "number", @class = "numericonly"}) @ * * @ – Naomi

1

Ich will nur meine Lösung für den Fall teilen kann es jemand helfen:

My New EditorFor:

<div class="editor-label"> 
    @Html.Label((ViewData.ModelMetadata.DisplayName??ViewData.ModelMetadata.PropertyName), 
     new Dictionary<string, object> 
      {     
       { "for", ViewData.ModelMetadata.PropertyName } 
      }) 
</div> 

<div class="editor-field"> 
    @if (ViewData.ModelMetadata.ModelType.IsNumeric()) 
    { 
    @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { type = "number", @class = "numericOnly" })  
    } 
    else 
    { 
    @Html.TextBox("", (object)Model, 
     new Dictionary<string, object> 
      { 
       { "id", ViewData.ModelMetadata.PropertyName }, 
       { "name", ViewData.ModelMetadata.PropertyName }, 
       { "class", "text-box single-line"}, 
       { "data-bind", "value: " + ViewData.ModelMetadata.PropertyName }, 
      }) 
    } 

    @Html.ValidationMessage(ViewData.ModelMetadata.PropertyName, 
     new Dictionary<string, object> 
      { 
       { "data-valmsg-for", ViewData.ModelMetadata.PropertyName } 
      }) 
</div> 

Und die Die IsNumeric-Erweiterungsmethode basiert auf dem Code, den ich im C# -MsDN-Forum gefunden habe, und dies ist die Implementierung:

/// <summary> 
/// Checks is the object is of numeric type 
     /// see http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/66a7dc8d-f276-4d45-8da4-f8d9857db52c/ 
/// </summary> 
/// <param name="obj"></param> 
/// <returns></returns> 
     public static bool IsNumeric(object obj) 
     { 
      return (obj == null) ? false : IsNumeric(obj.GetType()); 
     } 

     public static bool IsNumeric(this Type type) 
     { 
      if (type == null) 
       return false; 

      TypeCode typeCode = Type.GetTypeCode(type); 

      switch (typeCode) 
      { 
       case TypeCode.Byte: 
       case TypeCode.Decimal: 
       case TypeCode.Double: 
       case TypeCode.Int16: 
       case TypeCode.Int32: 
       case TypeCode.Int64: 
       case TypeCode.SByte: 
       case TypeCode.Single: 
       case TypeCode.UInt16: 
       case TypeCode.UInt32: 
       case TypeCode.UInt64: 
        return true; 
      } 
      return false; 
     } 
Verwandte Themen