2017-06-23 9 views
10

इस पर विचारों के साथ किसी के लिए भी एक अजीब से एक की बिट ... मैं किसी विशेष पृष्ठ पर एक छिपा बूलियन क्षेत्र प्रतिपादन कर रहा हूँ। हालांकि, प्रक्रिया के पहले एक विशेष घटना पहले हुई थी, इस पर निर्भर करता है कि मुझे एक ही क्षेत्र के लिए दो अलग-अलग मार्कअप मिलते हैं। उत्पन्न होने वाले दो क्षेत्र हैं;बूलियन विभिन्न मामलों के साथ गाया क्षेत्र

<input id="HasPreviouslyIssuedCard" name="HasPreviouslyIssuedCard" type="hidden" value="false" /> 

और

<input id="HasPreviouslyIssuedCard" name="HasPreviouslyIssuedCard" type="hidden" value="False" /> 

मुद्दा "मूल्य" विशेषता है जो आपको नज़र आएगा अलग है में पाठ का मामला है और बाद में जे एस की स्थिति को प्रभावित करता है। यह उत्पन्न करने वाला रेज़र मार्कअप है;

@Html.Hidden("HasPreviouslyIssuedCard", Model.HasPreviouslyIssuedCard?.ToString(), new { id = nameof(Model.HasPreviouslyIssuedCard) }) 

हालांकि, मैं भी एक प्रकार छिपी हुई फ़ील्ड प्रतिपादन में एक ही अंतर के साथ निम्नलिखित का उपयोग कर की कोशिश की है;

@Html.HiddenFor(m => m.HasPreviouslyIssuedCard) 

इस अंतर को पाने के लिए मैं क्या करूँ? अपरकेस संस्करण प्राप्त करने के लिए, मैंने प्रासंगिक पृष्ठ पर जाने से पहले ब्राउजर बैक बटन दबाया। दोनों विधियां डेटा को वैसे ही लोड करती हैं और वही मान प्रस्तुतकर्ता में उसी तरह से पास करती हैं। दो अलग आउटपुट।

मन में भालू इस एक बूलियन, मूल्य-प्रकार क्षेत्र प्रदान किया जा रहा है। टिंकर के साथ ज्यादा गुंजाइश नहीं होनी चाहिए। इसके चारों ओर काम करने के कई तरीके हैं लेकिन चूंकि हमारे पास बुलियन फ़ील्ड और बैक बटन से संबंधित बैकलॉग पर कुछ आइटम हैं, इसलिए मैं इसके आसपास काम करने के बजाय इसे समझाऊंगा।

मेरा सबसे अच्छा अनुमान यह है कि बैक बटन मारना किसी भी तरह से रेंडरर की स्थिति को बदल रहा है या मॉडल में कुछ अन्य ध्वज अलग है (70+ फ़ील्ड्स हैं क्योंकि यह एक जादूगर है) यह बदल रहा है कि रेंडरर कैसे व्याख्या करता है बुलियन मूल्य के मामले में। मान वही है, पृष्ठ वही है, डेटा उसी तरह पढ़ा जाता है।

इस पृष्ठ के आधार पर (Why does Boolean.ToString output "True" and not "true"), हमें hypothetically हर समय अपरकेस संस्करण प्राप्त करना चाहिए, लेकिन यह परिणाम नहीं है।

कोई भी लेने वाले/विचार/विचार?

संपादित करें 1

HiddenFor() विधि में MVC का प्रतिपादन तर्क के माध्यम से खुदाई, अंत में Convert.ToString(value, CultureInfo.CurrentCulture) कहा जाता है। जब इसे सीधे बुलाया जाता है तो मुझे लोअर-केस बूलियन का उत्पादन करने के लिए यह नहीं मिल सकता है, फिर भी यह स्पष्ट रूप से ऐसा कर रहा है। मेरा वर्तमान संस्कृति कोड en-IE पर सेट है लेकिन मैं इसे कॉल करते समय अपरकेस बूलियन मान देख रहा हूं।

संपादित 2

मैं थोड़ा अधिक फेरबदल किया है और अपने आवेदन के माध्यम से पता लगाने और हालांकि मैं नहीं किया है अभी तक एक सरल में यह पुन: पेश करने में सक्षम है क्या हो रहा है पर थोड़ा और अधिक विस्तार प्रदान कर सकते हैं किया है आवेदन।

एमवीसी 5 आवेदन: इसमें है;

  1. इसके साथ प्रारंभिक लैंडिंग पृष्ठ रूट डोमेन / HTTP GET के माध्यम से पुनःप्राप्त में यूआरएल है।बूलियन input टैग True/False
  2. यूआरएल /Apply पर एक विज़ार्ड में पहला पृष्ठ HTTP GET के माध्यम से पुनर्प्राप्त किया गया है। बूलियन input टैग True/False
  3. चरण 2 पर उपयोगकर्ता द्वारा सबमिट किए गए पृष्ठ के बाद एक ही यूआरएल पर विज़ार्ड में दूसरा पृष्ठ।के माध्यम से पुनर्प्राप्त। input टैग का मामला अब true/false के रूप में प्रस्तुत करता है।
  4. ब्राउज़र के बैक बटन और हिट ट्रैप पेज पर हिट करें (हम ब्राउजर इतिहास को बैक पर हमेशा एक जाल पेज पर हिट करने के लिए सेट करते हैं क्योंकि यह विज़ार्ड के साथ मजेदार नरक बजाता है)।
  5. उपयोगकर्ता ट्रैप पेज पर बटन हिट करता है ताकि उन्हें एप्लिकेशन में वापस लाया जा सके जहां उन्होंने छोड़ा था। input टैग अब अपरकेस में मूल प्रतिपादन (मूल रिपोर्ट की गई समस्या)।

मैं कोशिश करते हैं और के माध्यम से स्कैन और MVC (अगर मैं सही ढंग से कोड पढ़ रहा हूँ) को ILSpy का उपयोग कर वास्तव में मैं के रूप में बूलियन मान Convert.ToString(value, CultureInfo.CurrentCulture) लिखने के लिए, नहीं IConverter के एक कार्यान्वयन का उपयोग करता MVC पुस्तकालय में जाने पर किया गया है मूल रूप से सोचा।

कॉल से पता लगाए गए कोड का ढेर HiddenFor() है (मुझे लगता है);

  1. System.Web.Mvc.InputExtentions.HiddenFor() (सार्वजनिक समारोह)
  2. System.Web.Mvc.InputExtentions.HiddenHelper() (निजी समारोह, सरणियों के लिए कुछ तर्क यहाँ लेकिन हमारी स्थिति में लागू नहीं होता)
  3. System.Web.Mvc.InputExtentions.InputHelper() (निजी समारोह, जादू यहां होता है)

System.Web.Mvc.InputExtentions.InputHelper() के लिए डीकंपील्ड कोड;

private static MvcHtmlString InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, string format, IDictionary<string, object> htmlAttributes) 
{ 
    string fullHtmlFieldName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 
    if (string.IsNullOrEmpty(fullHtmlFieldName)) 
    { 
     throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name"); 
    } 
    TagBuilder tagBuilder = new TagBuilder("input"); 
    tagBuilder.MergeAttributes<string, object>(htmlAttributes); 
    tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType)); 
    tagBuilder.MergeAttribute("name", fullHtmlFieldName, true); 
    string text = htmlHelper.FormatValue(value, format); 
    bool flag = false; 
    switch (inputType) 
    { 
    case InputType.CheckBox: 
    { 
     bool? flag2 = htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(bool)) as bool?; 
     if (flag2.HasValue) 
     { 
      isChecked = flag2.Value; 
      flag = true; 
     } 
     break; 
    } 
    case InputType.Hidden: 
     goto IL_131; 
    case InputType.Password: 
     if (value != null) 
     { 
      tagBuilder.MergeAttribute("value", text, isExplicitValue); 
      goto IL_16C; 
     } 
     goto IL_16C; 
    case InputType.Radio: 
     break; 
    default: 
     goto IL_131; 
    } 
    if (!flag) 
    { 
     string text2 = htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string)) as string; 
     if (text2 != null) 
     { 
      isChecked = string.Equals(text2, text, StringComparison.Ordinal); 
      flag = true; 
     } 
    } 
    if (!flag && useViewData) 
    { 
     isChecked = htmlHelper.EvalBoolean(fullHtmlFieldName); 
    } 
    if (isChecked) 
    { 
     tagBuilder.MergeAttribute("checked", "checked"); 
    } 
    tagBuilder.MergeAttribute("value", text, isExplicitValue); 
    goto IL_16C; 
    IL_131: 
    string text3 = (string)htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string)); 
    tagBuilder.MergeAttribute("value", text3 ?? (useViewData ? htmlHelper.EvalString(fullHtmlFieldName, format) : text), isExplicitValue); 
    IL_16C: 
    if (setId) 
    { 
     tagBuilder.GenerateId(fullHtmlFieldName); 
    } 
    ModelState modelState; 
    if (htmlHelper.ViewData.ModelState.TryGetValue(fullHtmlFieldName, out modelState) && modelState.Errors.Count > 0) 
    { 
     tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName); 
    } 
    tagBuilder.MergeAttributes<string, object>(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata)); 
    if (inputType == InputType.CheckBox) 
    { 
     StringBuilder stringBuilder = new StringBuilder(); 
     stringBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing)); 
     TagBuilder tagBuilder2 = new TagBuilder("input"); 
     tagBuilder2.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden)); 
     tagBuilder2.MergeAttribute("name", fullHtmlFieldName); 
     tagBuilder2.MergeAttribute("value", "false"); 
     stringBuilder.Append(tagBuilder2.ToString(TagRenderMode.SelfClosing)); 
     return MvcHtmlString.Create(stringBuilder.ToString()); 
    } 
    return tagBuilder.ToMvcHtmlString(TagRenderMode.SelfClosing); 
} 

संपादित 3

बस के रूप में वहाँ चीजों की जावास्क्रिप्ट पक्ष पर कुछ टिप्पणी कर रहे हैं को फिर से करने के लिए। मैंने इस मुद्दे को निदान करने की कोशिश में इसे जल्दी माना था। किसी भी संभावित जेएस हस्तक्षेप/हेरफेर को रद्द करने के लिए, मैंने ट्रांसमिशन में HTML को कैप्चर करने के लिए फिडलर का उपयोग किया। एमवीसी उत्पन्न करने वाला एचटीएमएल केस बदल रहा है - और मैं इसे फिडलर में देख सकता हूं, जेएस पहले भी लोड होने से पहले, कभी भी रन नहीं रखता। यह एक जेएस मुद्दा नहीं है।

+0

संबंधित नहीं है, लेकिन इसके सिर्फ '@ Html.Hidden (" HasPreviouslyIssuedCard ")' - कि 'मान' उत्पन्न होगा और' id' रूप में एक ही विशेषताओं का '@ Html.HiddenFor (एम => m.HasPreviouslyIssuedCard) ' –

+0

@StephenMuecke जो डिजाइन द्वारा है – DiskJunky

+0

क्या यह संभव नहीं हो सकता है कि एक स्क्रिप्ट चल रही है जो इस छिपे हुए फ़ील्ड के मान को बदलती है? – brijber

उत्तर

3

ऐसा लगता है कि मैं गलत था, जेएस सभी के बाद, हालांकि उस बिंदु पर नहीं जहां मैं इसे रद्द करने की कोशिश कर रहा था।घटनाओं का अनुक्रम इस पुन: उत्पादन के लिए;

  1. जे एस का एक टुकड़ा है कि true (लोअरकेस) को बूलियन फ़ील्ड सेट करता है
  2. बूलियन छिपी हुई फ़ील्ड + गैर-सबमिट बटन
  3. बटन के लिए onclick घटना में साथ HTML form बनाएँ, है अपनी पोस्ट में नियंत्रक में कार्रवाई, एक ही दृश्य प्रस्तुत करें

पोस्ट के बाद बूलियन फ़ील्ड में अपरकेस के बजाय लोअरकेस मान होगा।

क्या चल रहा है? खैर, HiddenFor() (और इसके रूप) से बूलियन वैल्यू को मॉडल के बूलियन वैल्यू के बजाय प्रस्तुत करेंगे यदि यह ModelState संग्रह में मौजूद है। अंतर्ज्ञानी लगता है लेकिन क्या कर सकता है (और मेरे लिए किया गया) आपको फेंक देता है कि अन्य सभी डेटा प्रकार, मॉडल बाइंडर काफी विशिष्ट है - ModelState मान और आपके मॉडल की संपत्ति मान समान होगी। बूलियन के मामले में छोड़कर - मॉडल बाइंडर True और true के इलाज के लिए काफी स्मार्ट है, लेकिन यह ModelState मान और आपकी स्ट्रिंगिफाइड प्रॉपर्टी वैल्यू को जेएस बूलियन के माध्यम से सेट किया गया है।

के लिए के रूप में क्यों मेरे लिए यह रीसेट ब्राउज़र के वापस बटन से टकराने के बाद - जाल पृष्ठ है कि हम प्रपत्र मूल्यों और लिंक HTTP GET जो HiddenFor का कारण बनता है मॉडल संपत्ति के .ToString() बल्कि कॉल करने के लिए के माध्यम से आवेदन में वापस नहीं है इसे ModelState से खींचने से पहले क्योंकि उस समय उस समय नहीं है। इसी तरह, मेरे परीक्षणों में, उपयोगकर्ता जेएस के माध्यम से सेट होने के बाद लंबे समय तक विज़ार्ड में एक बिंदु पर होगा, इसलिए यह विज़ार्ड के माध्यम से जारी रहेगा क्योंकि यह अपरकेस में रहेगा।

मेरी धारणा यह थी कि जेएस लोड होने के बाद लात मार रहा था। यह वास्तव में पोस्ट को लात मारने से पहले जेएस को एक मूल्य निर्धारित करने के कारण था और पृष्ठ के जीवन चक्र के माध्यम से ModelState के माध्यम से कम मामला मूल्य जारी रहा। जाओ पता लगाओ।

संपादित

कोड पुन: पेश करने के लिए;

मॉडल;

public class Test 
{ 
    public bool Sample { get; set; } 
} 

रेज़र मार्कअप;

@model TestModelValueCase.Models.Test 
@{ 
    ViewBag.Title = "Test Page"; 
} 

@using (Html.BeginForm()) 
{ 
    @Html.HiddenFor(m => m.Sample) 
    <div> 
     <label>Hidden Value:</label> 
     <span id="_uiValue"></span> 
    </div> 
    <button type="submit">Try Post</button> 
} 
@section scripts 
{ 
    <script type="text/javascript" language="javascript"> 
     $(document).ready(function() { 
      var source = $('#@nameof(Model.Sample)'); 
      $('#_uiValue').html(source.val()); 
      source.val(true); 
     }); 
    </script> 
} 

नियंत्रक;

public ActionResult Index() 
    { 
     Test model = new Test(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(Test model) 
    { 
     return View(model); 
    } 
0

नियंत्रक से आने वाले बूलियन का मामला बहुत मुश्किल है क्योंकि स्ट्रिंग के रूप में व्याख्या किए गए समय का अधिकांश हिस्सा है।

यह @Hidden के मामले में प्रतीत होता है।

मुझे इसे प्राप्त करने के लिए आसान तरीका है के लिए, "कोई नहीं"

@html.CheckBoxFor(m=> m.HasPreviouslyIssuedCard, new { style ="display:none"})) 

इस समाधान के साथ करने के लिए चेकबॉक्स और प्रदर्शन सेट बनाने के लिए आप दोनों भाषा में एक अधिक टाइप चर होगा (सी # & जावास्क्रिप्ट) ।

+0

ऐसा लगता है कि यह सवाल का जवाब नहीं दे रहा है, यही कारण है कि यह कभी-कभी 'झूठी' के रूप में प्रस्तुत करता है और 'गलत' अन्य ... – Chris

+0

** गलत ** => स्ट्रिंग प्रारूप, ** झूठा ** => बूलियन प्रारूप। चेकबॉक्स हर समय बूलियन प्रारूप और JSCondition में उपयोग करेगा, आपको स्ट्रिंग के साथ तुलना करने की आवश्यकता नहीं है। – OrcusZ

+0

यह एक दिलचस्प कामकाज है लेकिन अभी भी एक कामकाज है। मैं समझा रहा हूं * क्यों * मामला बदलता है – DiskJunky

संबंधित मुद्दे