ASP.NET MVC 2 - HTML.Editor Nullable 유형?
-
28-09-2020 - |
문제
두 개의 편집기 템플릿이 있습니다. 소수점 하나와 소수점은 하나입니까?(nullable)
그러나 모델에서 10 진수가 없으면 정상적인 십진수 편집기를로드하려고 시도합니다.
<%: 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>" %>
.
nullable 10 진수 템플릿 :
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal?>" %>
.
나는 템플릿 이름을 전달하여 작동 할 수 있음을 알고 있습니다 (예 :
그러나 다른 모든 템플릿과 마찬가지로 유형을 사용하여 자동으로 작동하는 것이 정말로 그것을 선호합니다.
<%: Html.EditorFor(model => model.SomeNullableDecimal,
"NullableDecimalTemplate" )%>
. 해결책
Bryan 덕분에 긍정적 인 해결책을 얻으려고 할 수있는 현상금을 추가하기 위해 답변해서 답하고 대답은 확실히 아무 것도 아니라는 것을 발견했습니다 - 당신은 무효의 템플릿을 자동으로 발견 할 수 없습니다. 그 유형. 템플릿 이름을 사용해야합니다.
이것은 http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html . 그는 MVC의 권위있는 소스이므로 그가 말할 때 그를 믿어야합니다.
유형 이름을 검색 할 때 간단한 이름이 사용됩니다 (즉, type.name). 네임 스페이스가 없어야합니다. 또한 유형이있는 경우 괜찮을까요, 우리는 t를 찾습니다 (그래서) 부울 템플릿을 얻을 수 있습니다 "BOOL"을 사용하는지 여부 "Nullable")
그는 또한
라고 말하고 있습니다.이것은 템플릿을 쓰는 경우를 의미합니다 가치 유형에 대해서는 다음과 같습니다 가치가 있는지 여부에 대한 설명 무효가 가능하거나 아닙니다. 당신은 그를 사용할 수 있습니다 isnullableValueType 속성 ModelMetaData가 그인지를 결정하기 위해 값은 널 (null) 가능합니다. 우리는 알 수 있습니다 이 아래의 예 내장 부울 템플릿.
그렇습니다.이 질문에 대한 답이 있지만 불행히도 대답은 아니오입니다.
nullable 템플릿을 사용하려면 템플릿 이름을 설명해야합니다.
<%: Html.EditorFor(model => model.SomeNullableDecimal, "NullableDecimalTemplate" )%>
.
또는 nullable과 null이 아닌 유형을 모두 처리하는 하나의 템플릿을 사용할 수 있습니다.
<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
<%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
<%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>
. 다른 팁
Nullable 형식의 템플릿을 만들려면 템플릿의 이름을 기본 값 유형으로 지정한 다음 Nullable 모델로 편집기 템플릿을 만듭니다.
예를 들어, int 템플릿을 수행하고 싶습니다."Int32.cshtml"이라는 편집기 템플릿을 만들었고 INT를 사용하고 있습니까?모델로서.
템플릿은 "Nullable`1"이라는 이름을 지정해야합니다.이 값은 Nullable 구조체와 일치하므로 모델 유형의 스위치를 수행하고 "Nullable`1.ascx"
에서 유형을 기반으로 적절한 부분 템플릿을 렌더링 할 수 있습니다.당신이 원하는 방식으로 그것을 할 수있는 방법은 없습니다.십진수와 소수점을위한 템플릿 하나만있을 수 있습니까?그러나 템플릿에서 전달 된 값이 다음과 같이 Null이 지정된 유형 인 경우 템플릿에서 결정할 수 있습니다.
<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
<%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
<%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>
.
예, html.editorfor에서 템플릿을 지정하지 않고이 작업을 수행 할 수 있지만 UIHINT 속성을 사용하여 nullable 속성에 대한 템플릿을 지정해야합니다.
[UIHint("NullableDecimalTemplate")]
public decimal? SomeNullableDecimal { get; set; }
.