2011-02-18 11 views
7

के लिए किया जाता है, मैंने हाल ही में एएसपी.नेट एमवीसी डिस्प्ले टेम्पलेट्स के साथ एक मुद्दा मारा है। कहते हैं कि यह मेरे मॉडल है:एएसपी.नेट एमवीसी डिस्प्ले टेम्पलेट का उपयोग पूर्णांक

public class Model 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

इस नियंत्रक है:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new Model()); 
    } 
} 

और यह मेरा दृष्टिकोण है:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<DisplayTemplateWoes.Models.Model>" %> 

<!DOCTYPE html> 

<html> 
<head runat="server"> 
    <title>Index</title> 
</head> 
<body> 
    <div> 
     <%: Html.DisplayForModel() %> 
    </div> 
</body> 
</html> 

अगर मैं किसी कारण से सभी स्ट्रिंग्स के लिए एक प्रदर्शन टेम्पलेट की जरूरत है मैं इस तरह एक स्ट्रिंग.एक्सएक्स आंशिक दृश्य बनाउंगा:

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

<%: Model %> (<%: Model.Length %>) 

और यहां समस्या है - रनटाइम पर निम्नलिखित अपवाद फेंक दिया गया है: "शब्दकोश में दिया गया मॉडल आइटम 'System.Int32' प्रकार का है, लेकिन इस शब्दकोश के लिए 'System.String' प्रकार के मॉडल आइटम की आवश्यकता है।

ऐसा लगता है कि स्ट्रिंग.एक्सएक्स मॉडल मॉडल की पूर्णांक और स्ट्रिंग प्रॉपर्टी दोनों के लिए उपयोग किया जाता है। मुझे उम्मीद थी कि इसे केवल स्ट्रिंग प्रॉपर्टी के लिए इस्तेमाल किया जाए - इसके बाद इसे स्ट्रिंग.स्कैक्स नाम दिया गया ऑब्जेक्ट.एक्सएक्स या इंट 32.एक्सएक्स।

क्या यह डिज़ाइन द्वारा है? यदि हां - क्या यह कहीं दस्तावेज है? यदि नहीं - क्या इसे एक बग माना जा सकता है?

उत्तर

4

यह डिज़ाइन द्वारा प्रतीत होता है। आपको स्ट्रिंग टेम्पलेट को अधिक सामान्य बनाना होगा। स्ट्रिंग टेम्पलेट प्रत्येक गैर-जटिल मॉडल के लिए डिफ़ॉल्ट टेम्पलेट के रूप में काम करता है जिसमें इसका स्वयं का टेम्पलेट नहीं है। (FormattedModelValue वस्तु है) स्ट्रिंग के लिए

डिफ़ॉल्ट टेम्पलेट:

internal static string StringTemplate(HtmlHelper html) { 
    return html.Encode(html.ViewContext.ViewData.TemplateInfo.FormattedModelValue); 
} 

खाका चयन इस तरह दिखता है:

foreach (string templateHint in templateHints.Where(s => !String.IsNullOrEmpty(s))) { 
    yield return templateHint; 
} 

// We don't want to search for Nullable<T>, we want to search for T (which should handle both T and Nullable<T>) 
Type fieldType = Nullable.GetUnderlyingType(metadata.RealModelType) ?? metadata.RealModelType; 

// TODO: Make better string names for generic types 
yield return fieldType.Name; 

if (!metadata.IsComplexType) { 
    yield return "String"; 
} 
else if (fieldType.IsInterface) { 
    if (typeof(IEnumerable).IsAssignableFrom(fieldType)) { 
     yield return "Collection"; 
    } 

    yield return "Object"; 
} 
else { 
    bool isEnumerable = typeof(IEnumerable).IsAssignableFrom(fieldType); 

    while (true) { 
     fieldType = fieldType.BaseType; 
     if (fieldType == null) 
      break; 

     if (isEnumerable && fieldType == typeof(Object)) { 
      yield return "Collection"; 
     } 

     yield return fieldType.Name; 
    } 
} 

तो तुम केवल स्ट्रिंग के लिए खाका बनाने के लिए चाहते हैं, तो आप इसे पसंद करना चाहिए यह (स्ट्रिंग.एक्सएक्स):

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

<% var model = Model as string; %> 
<% if (model != null) { %> 
    <%: model %> (<%: model.Length %>) 
<% } else { %> 
    <%: Model %> 
<% } %> 
संबंधित मुद्दे