EditorFor呈现不同的字节和短

时间:2014-02-19 12:41:45

标签: c# asp.net-mvc twitter-bootstrap asp.net-mvc-5.1 .net-4.5

为什么EditorFor为byte和short呈现不同的类和输入类型,如下所示:

<div class="form-group">
    <input class="text-box single-line" data-val="true" 
        data-val-number="The field Num Year / Period must be a number."
        id="NumYear_Period" name="NumYear_Period" type="number" value="" />
</div>

<div class="form-group">
    <input class="form-control" data-val="true" 
        data-val-number="The field Start Year must be a number." 
        id="Start_Year_Period" name="Start_Year_Period" type="text" value="" />
</div>

其中“NumYear_Period”是可以为空的字节,“Start_Year_Period”是可以为空的短片:

    [Display(Name = "Num Year / Period")]
    public Nullable<byte> NumYear_Period { get; set; }

    [Display(Name = "Start Year")]
    public Nullable<short> Start_Year_Period { get; set; }

Create.cshtml视图包含:

<div class="form-group">
    @Html.EditorFor(model => model.NumYear_Period)
</div>
<div class="form-group">
    @Html.EditorFor(model => model.Start_Year_Period)
</div>

我没有编辑模板,所以为什么!!

使用Bootstrap,Visual Studio 2013 Update 1,MVC 5.1.1,.Net 4.5,Razor 3.1.1

1 个答案:

答案 0 :(得分:1)

呈现方式不同,因为short中定义的System.Int16私有集合中的_defaultEditorActionsSystem.Web.Mvc.Html.TemplateHelpers类型没有特定模板。它只有默认值:

    "HiddenInput",
    "MultilineText",
    "Password",
    "Text",
    "Collection",
    "PhoneNumber",
    "Url",
    "EmailAddress",
    "DateTime",
    "Date",
    "Time",
    typeof(byte).Name,
    typeof(sbyte).Name,
    typeof(int).Name,
    typeof(uint).Name,
    typeof(long).Name,
    typeof(ulong).Name,
    typeof(bool).Name,
    typeof(decimal).Name,
    typeof(string).Name,
    typeof(object).Name,

正如您已经声明的那样,您没有EditorFor模板,MVC框架无法为您呈现默认输入标记。

要为short数据类型创建特定的renderig,请将文件Int16添加到您的视图文件夹下的EditorTemplates文件夹中,或者在共享文件夹下添加以下内容:

@model short

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

这会将模型中的short类型呈现为

<input ..... type="number" ... />

或者,您可以使用UIHint来装饰您的模型属性,如下所示:

[Display(Name = "Start Year")]
[UIHint("Int32")]
public Nullable<short> Start_Year_Period { get; set; }

基本上指示TemplateHelper使用int类型的模板(或完全System.Int32