如何使输入字段仅允许使用EF和数据注释的数字?

Nao*_*omi 6 asp.net-mvc entity-framework data-annotations

我试图弄清楚是否有办法确保使用数据注释和实体框架允许仅数字输入.

我使用以下代码

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

我希望使用数字类来显示它.

在一个地方我使用以下

<input type="number" name="searchClientNo" class="numericOnly" /><br />
Run Code Online (Sandbox Code Playgroud)

但在我正在使用的报名表中

@Html.EditorFor(m => m.Number, EditorTemplate.TextBox)
Run Code Online (Sandbox Code Playgroud)

我有一个自定义的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">
    @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>
Run Code Online (Sandbox Code Playgroud)

我想知道如何保持这些代码没有更改,但仍然使用仅数字文本框.我需要使用UIHint吗?

或者,是否可以让我现有的EditorFor更聪明?

我发现这篇博客文章http://robseder.wordpress.com/2012/06/01/uihint-displaytemplates-and-editortemplates-in-mvc/但我已经在使用自定义的EditorFor了.可能是我需要添加一个新类型,例如,EditorTemplate.NumericTextBox并添加另一个编辑器?听起来它可能有用,我明天会试试这个......

非常感谢提前.

Dar*_*rov 9

您可以编写自定义编辑器模板~/Views/Shared/EditorTemplates/NumberTemplate.cshtml:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { type = "number" })
Run Code Online (Sandbox Code Playgroud)

然后使用以下UIHint属性修饰视图模型属性:

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

在你的视图中:

@Html.EditorFor(x => x.Number)
Run Code Online (Sandbox Code Playgroud)

或者如果您不想UIHint在视图模型上使用该属性EditorTemplate.NumericTextBox = "NumberTemplate",则可以定义,然后:

@Html.EditorFor(m => m.Number, EditorTemplate.NumericTextBox)
Run Code Online (Sandbox Code Playgroud)