12

मेरे पास दो संपादक टेम्पलेट्स हैं: एक दशमलव के लिए, और दशमलव के लिए एक? (नल)एएसपी.नेट एमवीसी 2 - एचटीएमएल.एडिटर एक निरर्थक प्रकार के लिए?

लेकिन जब मैं अपने मॉडल में एक नल दशमलव है, यह सामान्य दशमलव संपादक लोड करने के लिए कोशिश करता है:

<%: 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 दशमलव टेम्पलेट:

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

मुझे पता है था टी मैं इसे टेम्पलेट नाम में गुजरकर काम कर सकता हूं, उदाहरण के लिए

लेकिन मैं वास्तव में अन्य सभी टेम्पलेट्स की तरह ही प्रकार का उपयोग करके स्वचालित रूप से काम करना पसंद करूंगा।

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

क्या आपके टेम्पलेट्स के नाम दशमलव हैं .ascx और दशमलव? .ascx? – ZippyV

+0

नहीं वे दशमलव हैं .ascx और NullableDecimal.ascx –

+2

कोई नहीं? .. बाहर निकलता है मैं decimal.ascx के अंदर NullableDecimal.ascx कोड को कॉपी करके इसे "ठीक" कर सकता हूं। आश्चर्यजनक रूप से पर्याप्त, एक मानक दशमलव का उपयोग निरर्थक टेम्पलेट में किया जा सकता है। मुझे नहीं पता कि एक गैर-शून्य दशमलव एक टेम्पलेट में क्यों काम करेगा जिसमें कोड है: if (myDecimal.HasValue) –

उत्तर

16

के माध्यम से प्रकार के आधार पर उपयुक्त आंशिक टेम्पलेट प्रस्तुत कर सकते हैं। ब्रायन को धन्यवाद देने के लिए एक उपहार देने के लिए धन्यवाद एक सकारात्मक समाधान प्राप्त करने के लिए, लेकिन मुझे जवाब देना होगा और कहेंगे कि मुझे पता चला है कि उत्तर निश्चित रूप से नहीं है - आपके पास इसके प्रकार से स्वत: खोजी गई एक संक्षिप्त टेम्पलेट नहीं हो सकती है। आपको टेम्पलेट नाम का उपयोग करना होगा।

यह ब्रैड विल्सन के ब्लॉग से http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html पर प्रासंगिक उद्धरण है।

जब प्रकार का नाम के लिए खोज, सरल नाम का इस्तेमाल किया जाता है (यानी, Type.Name) नाम स्थान के बिना: तो मैं उस पर विश्वास करने के लिए जब वे कहते हैं है वह MVC पर एक आधिकारिक स्रोत है। इसके अलावा, अगर प्रकार Nullable है, हम टी (ताकि आप बूलियन टेम्पलेट कि क्या आप "bool" का उपयोग कर रहे मिलेगा या "Nullable")

उन्होंने यह भी कहना है के लिए खोज

इसका मतलब है आप मूल्य प्रकार के लिए टेम्पलेट्स लिख रहे हैं, तो आप चाहे मूल्य नल है या नहीं के लिए खाते की आवश्यकता होगी। मान मान निर्धारित करने के लिए IsNullableValueType प्रॉपर्टी ModelMetadata का उपयोग कर सकते हैं। हम नीचे अंतर्निहित बूलियन टेम्पलेट के साथ इसका उदाहरण देखेंगे।

तो हाँ इस प्रश्न का उत्तर है, लेकिन दुर्भाग्य से उत्तर नहीं है।

एक नल टेम्पलेट का उपयोग करने के लिए आप explictly टेम्पलेट नाम का उपयोग करना चाहिए:

<%: 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" })%> 
<% } %> 
0

जिस तरह से आप चाहते हैं उसे करने का कोई तरीका नहीं है। दशमलव और दशमलव के लिए केवल एक टेम्पलेट हो सकता है? लेकिन आप टेम्पलेट में निर्धारित कर सकते हैं में पारित मूल्य इस तरह नल प्रकार का है:

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

1

टेम्पलेट "Nullable`1" नाम करना होगा। चूंकि यह किसी भी नालीबल संरचना से मेल खाता है, तो आप मॉडल प्रकार पर एक स्विच कर सकते हैं और "Nullable`1.ascx"

+0

मेरा यूके कीबोर्ड लेआउट मुझे विफल कर दिया है: पी – Trumpi

2

आदेश में एक शून्य प्रकार के लिए टेम्पलेट बनाने के लिए, आप अपने टेम्पलेट को मूल मान प्रकार के रूप में नामित करते हैं और फिर अपने संपादक टेम्पलेट को एक शून्य मॉडल के साथ बनाते हैं।

उदाहरण के लिए, मैं int के लिए टेम्पलेट करना चाहता हूं? मैंने "int32.cshtml" नामक एक संपादक टेम्पलेट बनाया है और मैं int का उपयोग कर रहा हूं? मॉडल के रूप में।

आप अतिरिक्त विवरण चाहते हैं, यहाँ देखो: http://www.campusmvp.net/blog/asp-net-mvc-editorfor-for-nullable-propierties

0

हाँ, आप Html.EditorFor में टेम्पलेट निर्दिष्ट किए बिना ऐसा कर सकते हैं, लेकिन फिर आप नल संपत्ति UIhint विशेषता का उपयोग कर के खिलाफ टेम्प्लेट निर्दिष्ट की जरूरत है।

[UIHint("NullableDecimalTemplate")] 
public decimal? SomeNullableDecimal { get; set; } 
संबंधित मुद्दे