इस पर विचारों के साथ किसी के लिए भी एक अजीब से एक की बिट ... मैं किसी विशेष पृष्ठ पर एक छिपा बूलियन क्षेत्र प्रतिपादन कर रहा हूँ। हालांकि, प्रक्रिया के पहले एक विशेष घटना पहले हुई थी, इस पर निर्भर करता है कि मुझे एक ही क्षेत्र के लिए दो अलग-अलग मार्कअप मिलते हैं। उत्पन्न होने वाले दो क्षेत्र हैं;बूलियन विभिन्न मामलों के साथ गाया क्षेत्र
<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 आवेदन: इसमें है;
- इसके साथ प्रारंभिक लैंडिंग पृष्ठ रूट डोमेन
/
HTTPGET
के माध्यम से पुनःप्राप्त में यूआरएल है।बूलियनinput
टैगTrue
/False
- यूआरएल
/Apply
पर एक विज़ार्ड में पहला पृष्ठ HTTPGET
के माध्यम से पुनर्प्राप्त किया गया है। बूलियनinput
टैगTrue
/False
- चरण 2 पर उपयोगकर्ता द्वारा सबमिट किए गए पृष्ठ के बाद एक ही यूआरएल पर विज़ार्ड में दूसरा पृष्ठ।के माध्यम से पुनर्प्राप्त।
input
टैग का मामला अबtrue
/false
के रूप में प्रस्तुत करता है। - ब्राउज़र के बैक बटन और हिट ट्रैप पेज पर हिट करें (हम ब्राउजर इतिहास को बैक पर हमेशा एक जाल पेज पर हिट करने के लिए सेट करते हैं क्योंकि यह विज़ार्ड के साथ मजेदार नरक बजाता है)।
- उपयोगकर्ता ट्रैप पेज पर बटन हिट करता है ताकि उन्हें एप्लिकेशन में वापस लाया जा सके जहां उन्होंने छोड़ा था।
input
टैग अब अपरकेस में मूल प्रतिपादन (मूल रिपोर्ट की गई समस्या)।
मैं कोशिश करते हैं और के माध्यम से स्कैन और MVC (अगर मैं सही ढंग से कोड पढ़ रहा हूँ) को ILSpy का उपयोग कर वास्तव में मैं के रूप में बूलियन मान Convert.ToString(value, CultureInfo.CurrentCulture)
लिखने के लिए, नहीं IConverter
के एक कार्यान्वयन का उपयोग करता MVC पुस्तकालय में जाने पर किया गया है मूल रूप से सोचा।
कॉल से पता लगाए गए कोड का ढेर HiddenFor()
है (मुझे लगता है);
System.Web.Mvc.InputExtentions.HiddenFor()
(सार्वजनिक समारोह)System.Web.Mvc.InputExtentions.HiddenHelper()
(निजी समारोह, सरणियों के लिए कुछ तर्क यहाँ लेकिन हमारी स्थिति में लागू नहीं होता)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 को कैप्चर करने के लिए फिडलर का उपयोग किया। एमवीसी उत्पन्न करने वाला एचटीएमएल केस बदल रहा है - और मैं इसे फिडलर में देख सकता हूं, जेएस पहले भी लोड होने से पहले, कभी भी रन नहीं रखता। यह एक जेएस मुद्दा नहीं है।
संबंधित नहीं है, लेकिन इसके सिर्फ '@ Html.Hidden (" HasPreviouslyIssuedCard ")' - कि 'मान' उत्पन्न होगा और' id' रूप में एक ही विशेषताओं का '@ Html.HiddenFor (एम => m.HasPreviouslyIssuedCard) ' –
@StephenMuecke जो डिजाइन द्वारा है – DiskJunky
क्या यह संभव नहीं हो सकता है कि एक स्क्रिप्ट चल रही है जो इस छिपे हुए फ़ील्ड के मान को बदलती है? – brijber