代码之家  ›  专栏  ›  技术社区  ›  JK.

ASP.NET MVC 2-Html.editor是否为可空类型?

  •  12
  • JK.  · 技术社区  · 16 年前

    但是,当我的模型中有一个可为空的小数点时,它会尝试加载普通的小数点编辑器:

    <%: Html.EditorFor(model => model.SomeDecimal )%>
    <%: Html.EditorFor(model => model.SomeNullableDecimal )%>
    

    第一个工作正常,并加载十进制编辑器模板。第二个也尝试加载decimal模板(由于它不是decimal字段而失败)。

    错误消息是:

    The model item passed into the dictionary is null, but this dictionary requires 
    a non-null model item of type 'System.Decimal'. 
    

    我的模板声明如下:

    十进制模板:

    <%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<System.Decimal>" %>
    

    可为空的十进制模板:

    <%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<System.Decimal?>" %>
    

    我知道我可以通过传递模板名称使其工作,例如

    <%: Html.EditorFor(model => model.SomeNullableDecimal, 
    "NullableDecimalTemplate" )%>
    
    5 回复  |  直到 12 年前
        1
  •  16
  •   JK.    15 年前

    感谢Bryan添加了一个赏金来尝试获得一个积极的解决方案,但是我必须回答并说,我发现答案肯定是否定的-你不能让一个可为null的模板从它的类型中自动发现。必须使用模板名称。

    http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html . 他是MVC的权威人士,所以当他说:

    在搜索类型名称时 使用简单名称(即Type.name) 是可空的,我们搜索T(所以 不管你用的是bool还是

    这意味着如果你在写模板 对于值类型,您需要 是否为空。你可以用 的IsNullableValueType属性 ModelMetadata以确定 内置布尔模板。

    所以这个问题是有答案的,但不幸的是答案是否定的。

    <%: Html.EditorFor(model => model.SomeNullableDecimal, "NullableDecimalTemplate" )%>
    

    或者可以使用一个模板来处理可为null和不可为null的类型:

    <% if (ViewData.ModelMetadata.IsNullableValueType) { %>
        <%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
    <% } else { %>
        <%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
    <% } %>
    
        2
  •  2
  •   Scott Baker    7 年前

    为了为可空类型创建模板,可以将模板命名为基值类型,然后使用可空模型创建编辑器模板。

    例如,我想为int?创建一个模板?。我创建了一个名为“int32.cshtml”的编辑器模板,我正在使用int?作为模型。

        3
  •  1
  •   knittl    13 年前

        4
  •  0
  •   zihotki    15 年前

    <% if (ViewData.ModelMetadata.IsNullableValueType) { %>
        <%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
    <% } else { %>
        <%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
    <% } %>
    

    this blog post

        5
  •  0
  •   AntonK    9 年前

    [UIHint("NullableDecimalTemplate")]
    public decimal? SomeNullableDecimal { get; set; }