문제

두 개의 편집기 템플릿이 있습니다. 소수점 하나와 소수점은 하나입니까?(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; }
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top