2012-12-21 16 views
6

Sto cercando di capire se esiste un modo per assicurarsi che l'input solo numerico sia consentito utilizzando Annotazioni dati ed Entity Framework.Come rendere il campo di immissione per consentire numeri solo utilizzando EF e Annotazioni dati?

Sto usando il seguente codice

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

Voglio che questo per essere visualizzato utilizzando la classe numero.

In un posto in cui utilizzare il seguente

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

ma nel modulo di iscrizione che sto usando

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

dove ho una custom made EditorFor con il seguente codice

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

Mi chiedo come è possibile mantenere questo codice senza modifiche ma utilizzare comunque la sola casella di testo numerico. Devo usare UIHint?

Oppure, in alternativa, è possibile fare il mio attuale EditorFor più intelligente?

Ho trovato questo post del blog http://robseder.wordpress.com/2012/06/01/uihint-displaytemplates-and-editortemplates-in-mvc/ ma sto già utilizzando una consuetudine EditorFor. Potrebbe essere necessario aggiungere un nuovo tipo, ad esempio EditorTemplate.NumericTextBox e aggiungere un altro editor? Questo suona come si può lavorare, ho intenzione di provare questo domani ...

Grazie mille in anticipo.

risposta

9

Si potrebbe scrivere un modello di editor personalizzato ~/Views/Shared/EditorTemplates/NumberTemplate.cshtml:

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

e poi decorare la vostra proprietà vista del modello con l'attributo UIHint:

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

e all'interno della vostra vista:

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

o se non si desidera utilizzare il UIHint attributo del modello di visualizzazione è possibile definire EditorTemplate.NumericTextBox = "NumberTemplate" e poi:

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

Hi Darin, Questa è la soluzione che stavo pensando di implementare, ma voglio chiedere se è possibile all'interno di un particolare EditorFor (il mio tipo generico di tetxbox) prendere in qualche modo la decisione in base al tipo del modello? Ho aggiunto il mio codice corrente alla domanda. – Naomi

+0

e inoltre, sto usando @ Html.TextBox e fornisco le proprietà, ma come apparirà il codice se invece proverò a usare ? – Naomi

+0

Darin, Ho poche altre domande correlate. Ho implementato il seguente @ Html.TextBox ("", ViewData.TemplateInfo.FormattedModelValue, new {type = "number", @class = "numericonly"}) @ * * @ – Naomi

1

Voglio solo condividere la mia soluzione in caso può aiutare qualcuno:

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> 

E il Il metodo di estensione IsNumeric è basato sul codice che ho trovato nel forum MSDN C# e questa è la sua implementazione:

/// <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; 
     } 
Problemi correlati