2012-12-21 1 views
6

Data Annotation과 Entity Framework를 사용하여 숫자로만 입력 할 수 있는지 확인하는 방법이 있는지 알아 내려고합니다.EF 및 데이터 주석을 사용하는 번호 만 허용하는 입력 필드를 만드는 방법은 무엇입니까?

나는이 번호 클래스를 사용하여 표시 할 다음 코드

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

을 사용하고 있습니다. 나는

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

다음을 사용하지만, 참가 신청서에 내가 다음 코드

<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을 만든 사용자 지정을

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

를 사용하고 한 곳에서

변경하지 않고이 코드를 어떻게 유지할 수 있을지 궁금하지만 수치 전용 텍스트 상자를 사용하십시오. UIHint를 사용해야합니까?

또는 기존 에디터를 더 똑똑하게 만들 수 있습니까?

이 블로그 게시물 http://robseder.wordpress.com/2012/06/01/uihint-displaytemplates-and-editortemplates-in-mvc/을 발견했지만 이미 사용자 정의 EditorFor를 사용하고 있습니다. EditorTemplate.NumericTextBox라는 새로운 유형을 추가하고 다른 편집기를 추가해야합니까? 이것은 작동하는 것처럼 들리지만, 내일 이것을 시도 할 것입니다 ...

미리 감사드립니다.

사용자 정의 편집기 템플릿 ~/Views/Shared/EditorTemplates/NumberTemplate.cshtml 쓸 수

답변

9

:

@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

안녕 Darin, 이것은 구현을 생각하고 있었지만 특정 EditorFor (내 일반 tetxbox 유형) 내부에서 가능한지 모델 유형에 따라 결정을 내릴 수 있는지 묻고 싶습니다. 나는 현재의 코드를 질문에 추가했다. – Naomi

+0

또한 @Html.TextBox를 사용하여 속성을 제공하지만 대신 를 사용하여 코드가 어떻게 보이는지를 보여줍니다. – Naomi

+0

Darin, 관련 질문이 더 많습니다. 다음을 구현했습니다. @ Html.TextBox ("", ViewData.TemplateInfo.FormattedModelValue, new {type = "number", @class = "numericonly"}) @ * 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 확장 메서드는 C# MSDN 포럼에서 찾은 코드를 기반으로하며 구현은 다음과 같습니다.

/// <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; 
     } 
관련 문제