मेरे पास यह कार्यक्रम है

private static void RunUsingILiquidizable()
{
    const string templateString = @"TopInt prop: '{{TopInt}}'; Child.Prop prop: '{{L1Prop.L1Int}}'; Child.Child.Prop prop: '{{L1Prop.L2Prop.L2Int}}'; Dict item: '{{ExtendedProps.Key1}}'";
    Template.NamingConvention = new CSharpNamingConvention();
    Template.RegisterValueTypeTransformer(typeof(DateTime), (v) => ((DateTime)v).ToString("MM=dd=yy"));
    var t = Template.Parse(templateString);

    var model = new TopModel()
    {
        TopInt = 23,
        L1Prop = new L1Model()
        {
            L1Int = 34,
            L2Prop = new L2Model() { L2Int = 98 }
        },
        ExtendedProps = new Dictionary<string, object>() { { "Key1", DateTime.Now } }
    };

    string output = t.Render(Hash.FromAnonymousObject(model));

    Console.WriteLine("RunUsingILiquidizable -->" + output);

}

शीर्ष मॉडल परिभाषा:

public class TopModel : ILiquidizable
{
    public int TopInt { get; set; }
    public L1Model L1Prop { get; set; }
    public Dictionary<string, object> ExtendedProps { get; set; }
    public object ToLiquid()
    {
        return new { TopInt, L1Prop, ExtendedProps };
    }
}

आउटपुट:

RunUsingILiquidizable -> TopInt प्रोप: '23'; चाइल्ड.प्रॉप प्रोप: '34'; चाइल्ड.चाइल्ड.पी रोप प्रोप: '98'; तानाशाही आइटम: '08=27=19'

मेरी समस्या है - Template.RegisterValueTypeTransformer वैश्विक प्रकार प्रारूप करता है और template.Render(Hash.FromAnonymousObject(model), MyFormatProvider) सभी तिथियों को प्रारूपित करता है, संख्याएं समान होती हैं।

प्रारूप की आपूर्ति करके आवश्यक होने पर मुझे प्रत्येक विशिष्ट टोकन को अलग-अलग प्रारूपित करने की आवश्यकता होती है। शब्दकोश ExtendedProps के लिए विशेष रूप से महत्वपूर्ण है।

मैंने फ़िल्टर भी करने की कोशिश की लेकिन क्या {{ExtendedProps.Key1 | SpecialFormat("dd--MM")}} जैसे कुछ पास करने का कोई तरीका है ??

1
T.S. 28 अगस्त 2019, 06:30

1 उत्तर

सबसे बढ़िया उत्तर

मैं आपको StandardFilters वर्ग के स्रोत कोड की जांच करने के लिए प्रोत्साहित करता हूं। कस्टम फ़िल्टर आपके द्वारा विश्वास किए जाने वाले विकी दस्तावेज़ों से कहीं अधिक कर सकते हैं, और मानक फ़िल्टर इसका बहुत कुछ प्रदर्शित करते हैं। यदि ऐसा कुछ है जो आपने मानक फ़िल्टर को करते देखा है, तो आप एक कस्टम फ़िल्टर लिख सकते हैं जो वही काम करता है।

यहाँ एक उदाहरण custom_date फ़िल्टर है:

public static class CustomFilter
{
    public static string CustomDate(Context context, object input, string format = null, string culture = null)
    {
        if (input is DateTime dt)
        {
            IFormatProvider formatProvider = !string.IsNullOrEmpty(culture)
                ? CultureInfo.GetCultureInfo(culture)
                : context.FormatProvider;

            return dt.ToString(format, formatProvider);
        }

        return null;
    }
}

ब्याज के अंक:

  1. यह एक प्रारंभिक Context पैरामीटर को स्वीकार करता है, जिसमें FormatProvider प्रकार की IFormatProvider (जो CultureInfo लागू होती है) की संपत्ति शामिल है। यदि आपको इससे कुछ चाहिए तो आपको केवल इस पैरामीटर को शामिल करने की आवश्यकता है।

  2. यह कई मापदंडों को स्वीकार करता है:

    ए। एक प्रारूप, जैसे कुछ ToString ओवरलोड हो जाता है, और बस इसे पास कर देता है।

    बी। एक स्थान जिसके लिए यह CultureInfo या, यदि null या "" को पुनः प्राप्त करता है, तो context.FormatProvider के लिए डिफ़ॉल्ट है, जो या तो वैकल्पिक IFormatProvider है जिसे Render या वर्तमान संस्कृति।

  3. पैरामीटर डिफ़ॉल्ट हैं। यह शायद सामान्य रूप से एक अच्छा विचार है क्योंकि टेम्पलेट में उन्हें आवश्यक बनाने का कोई तरीका नहीं है।

उदाहरण उपयोग

Template.Register(typeof(CustomFilter));

CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
var template = Template.Parse("Today is {{ today | custom_date: 'd' }} (current culture), {{ today | custom_date: 'd', 'fr-CA' }} (fr-CA), and {{ today | custom_date: 'd', elsewhere }} ({{ elsewhere }}).");
string output = template.Render(Hash.FromAnonymousObject(new { today = DateTime.Today, elsewhere = "de-DE" }));

आउटपुट

आज 8/30/2019 (वर्तमान संस्कृति), 2019-08-30 (fr-CA), और 30.08.2019 (de-DE) है।

रुचि के अधिक बिंदु:

  1. पैरामीटर एक कोलन के बाद निर्दिष्ट किए जाते हैं और एक से अधिक होने पर अल्पविराम द्वारा अलग किए जाते हैं।

  2. आपके द्वारा पास किए गए "हैश" के मान Render को आपके द्वारा पास किए गए पैरामीटर (उदा. elsewhere) में संदर्भित किया जा सकता है।

  3. "d" मानक प्रारूप संस्कृति के प्रति संवेदनशील है ताकि आप देख सकें कि वर्तमान संस्कृति (en-US), एक हार्ड-कोडित संस्कृति (fr-CA), और एक पैरामीटरयुक्त संस्कृति (de-DE) सभी का उपयोग किया जा सकता है।

1
madreflection 30 अगस्त 2019, 10:52