【问题标题】:EditorFor renders different for byte and shortEditorFor 呈现不同的字节和短
【发布时间】:2014-06-28 01:17:05
【问题描述】:

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>

我没有 EditorTemplates,为什么!!

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

【问题讨论】:

  • +1 我想知道这是否是HtmlHelper 中的错误,并且尚未更新以解决bytes。毕竟,我想我不记得我上次要求用户在浏览器中输入 1 和 0 并在您的视图模型中使用 byte 时,这正是您要求他们做的事情。我会在您的视图模型中使用Short,因为您要求用户输入一个数字,而不是一系列 1 和 0。
  • 嗯,它更多的是范围限制,因为模型通过实体框架由数据库模型管理。也就是说,数据库表已经创建,或者说是固有的,并且模型创建为 Database First。
  • 我明白了。我认为大多数人将视图模型用于屏幕上的属性,而域模型是数据库中数据的表示。实体的领域模型往往更大,而视图模型只是您想在屏幕上使用的数据。因此,两者通常是断开的,必须发生一些映射。

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


【解决方案1】:

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

    "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 数据类型的特定渲染,请将文件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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多