[英]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.