簡體   English   中英

ASP.NET MVC 2 - Html.Editor對於可以為空的類型?

[英]ASP.NET MVC 2 - Html.EditorFor a nullable type?

我有兩個編輯器模板:一個用於十進制,一個用於十進制? (可為空的)

但是當我的模型中有一個可以為空的小數時,它會嘗試加載普通的十進制編輯器:

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

第一個工作正常,並加載十進制編輯器模板。 第二個也嘗試加載十進制模板(並且因為它不是十進制字段而失敗)。

錯誤消息是:

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" )%>

感謝Bryan為了嘗試獲得積極的解決方案而增加賞金,但我將不得不回答並說我發現答案絕對沒有 - 你不能從它的類型中自動發現一個可以為空的模板。 您必須使用模板名稱。

這是Brad Wilson博客http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html的相關引用。 他是MVC的權威來源,因此我不得不相信他,當他說:

搜索類型名稱時,使用簡單名稱(即Type.Name)而不使用名稱空間。 此外,如果類型為Nullable,我們搜索T(因此,無論您使用的是“bool”還是“Nullable”,您都將獲得布爾模板)

他還接着說

這意味着如果您正在為值類型編寫模板,則需要考慮該值是否可為空。 您可以使用ModelMetadata的IsNullableValueType屬性來確定該值是否可為空。 我們將在下面看到內置布爾模板的示例。

所以肯定有這個問題的答案,但不幸的是答案是否定的。

要使用可空模板,您必須明確使用模板名稱:

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

或者您可以使用一個處理可空和非可空類型的模板:

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

要為可為空的類型創建模板,請將模板命名為基值類型,然后使用可為空的模型創建編輯器模板。

例如,我想為int做一個模板? 我創建了一個名為“int32.cshtml”的編輯器模板,我正在使用int? 作為模型。

模板必須命名為“Nullable`1”。 由於這將匹配任何Nullable結構,因此您可以在模型類型上進行切換,並根據“Nullable .1.ascx”中的類型呈現相應的部分模板。

是的,您可以在不指定Html.EditorFor中的模板的情況下執行此操作,但是您需要使用UIhint屬性針對nullable屬性指定模板。

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

沒有辦法以你想要的方式去做。 十進制和十進制只能有一個模板? 但是你可以在模板中確定傳入的值是否為可空類型,如下所示:

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

有關詳細信息,請查看此博文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM