2012-12-21 16 views
6

मैं यह पता लगाने की कोशिश कर रहा हूं कि डेटा एनोटेशन और एंटिटी फ्रेमवर्क का उपयोग करके संख्यात्मक इनपुट की अनुमति है या नहीं।केवल ईएफ और डेटा एनोटेशन का उपयोग करके संख्याओं को अनुमति देने के लिए प्रवेश क्षेत्र कैसे बनाएं?

मैं निम्नलिखित कोड

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

मैं इस नंबर वर्ग का उपयोग कर प्रदर्शित करना चाहते हैं का उपयोग कर रहा हूँ।

एक जगह में मैं निम्नलिखित का उपयोग

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

लेकिन प्रविष्टि के रूप में मैं

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

जहां मैं निम्नलिखित कोड

<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> 
साथ EditorFor बनाया एक कस्टम का उपयोग कर रहा है

मैं सोच रहा हूं कि मैं बिना किसी परिवर्तन के इस कोड को कैसे रख सकता हूं लेकिन अभी भी संख्यात्मक टेक्स्टबॉक्स का उपयोग कर सकता हूं। क्या मुझे UIHint का उपयोग करने की आवश्यकता है?

या वैकल्पिक रूप से, क्या मेरे मौजूदा संपादक को बेहतर बनाना संभव है?

मुझे यह ब्लॉग पोस्ट http://robseder.wordpress.com/2012/06/01/uihint-displaytemplates-and-editortemplates-in-mvc/ मिला है लेकिन मैं पहले से ही एक कस्टम संपादक का उपयोग कर रहा हूं। हो सकता है कि मुझे एक नया प्रकार जोड़ने की ज़रूरत हो, कहें, EditorTemplate.NumericTextBox और एक और संपादक जोड़ें? ऐसा लगता है जैसे यह काम कर सकता है, मैं कल यह कोशिश करने जा रहा हूं ...

बहुत पहले से धन्यवाद।

उत्तर

9

आप एक कस्टम संपादक टेम्पलेट ~/Views/Shared/EditorTemplates/NumberTemplate.cshtml लिख सकते हैं:

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

और फिर UIHint विशेषता के साथ अपने दृश्य मॉडल संपत्ति को सजाने:

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

और आपके विचार के अंदर:

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

या यदि आपका उपयोग नहीं करना चाहते हैं आपके विचार मॉडल परविशेषता आप EditorTemplate.NumericTextBox = "NumberTemplate" निर्धारित कर सकते हैं और उसके बाद:

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

हाय डारिन, यह वह समाधान है जिसे मैं कार्यान्वित करने के बारे में सोच रहा था, लेकिन यह पूछना चाहता हूं कि यह एक विशेष संपादक के अंदर संभव है (मेरा जेनेरिक tetxbox प्रकार) किसी भी तरह मॉडल के प्रकार के आधार पर निर्णय लेता है? मैंने प्रश्न में अपना वर्तमान कोड जोड़ा। – Naomi

+0

और साथ ही, मैं @ Html.TextBox का उपयोग कर रहा हूं और गुण प्रदान करता हूं, लेकिन अगर कोड <इनपुट प्रकार = "संख्या"> का उपयोग करने का प्रयास करेगा तो कोड कैसा दिखाई देगा? – Naomi

+0

डारिन, मेरे पास कुछ और संबंधित प्रश्न हैं। मैंने निम्नलिखित @ एचटीएमएल को लागू किया। टेक्स्टबॉक्स ("", व्यूडाटा। टेम्पलेटइंफो। फॉर्मेटेड मॉडेल वैल्यू, नया {टाइप = "नंबर", @class = "numericonly"}) @ * <इनपुट प्रकार = "संख्या" आईडी = "@ व्यूडाटा .ModelMetadata.PropertyName "name =" @ ViewData.ModelMetadata.PropertyName "class =" numericOnly "value =" @ model " डेटा-बाइंड =" @ व्यूडाटा.मोडेल मेटाडाटा। प्रॉपर्टी नाम "/> * @ – Naomi

1

शायद ज़रुरत यह मदद मिल सकती है में मेरे समाधान साझा करना चाहते हैं किसी को:

मेरी नई 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> 

और IsNumeric एक्सटेंशन विधि सी # एमएसडीएन फोरम में मिले कोड पर आधारित है और यह इसका कार्यान्वयन है:

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