asp.net mvc - HTML.HiddenFor मान सेट




asp.net-mvc asp.net-mvc-3 (4)

@Html.HiddenFor(model => model.title, new { id= "natureOfVisitField", @value = '@Model.title'})

यह काम नहीं करता है! मूल्य कैसे सेट करें?


HtmlAttributes निर्दिष्ट करते समय @ प्रतीक का उपयोग तब किया जाता है जब "चीज़" जिसे आप सेट करने का प्रयास कर रहे हैं वह एक कीवर्ड c # है। तो उदाहरण के लिए शब्द वर्ग, आप कक्षा निर्दिष्ट नहीं कर सकते हैं, आपको @class का उपयोग करना होगा।


अजीब लेकिन, @ वैल्यू, पूंजी "वी" के साथ प्रयास करें

उदाहरण के लिए (एमवीसी 4 पर काम करना)

@Html.HiddenFor(m => m.Id, new { @Value = Model.Id })

अद्यतन करें:

पाया गया कि @ वैल्यू (पूंजी वी) "मूल्य" के साथ "मूल्य" के साथ एक और विशेषता बना रहा है, छोटे @value का उपयोग करके भी काम कर रहा है!

अधिक खोजने के लिए एमवीसी स्रोत कोड की जांच करने की आवश्यकता है।

अपडेट करें, यह आंतरिक रूप से कैसे काम करता है इसके माध्यम से:

सबसे पहले इन सभी कामकाजों को भूल जाओ (मैंने यहां निरंतरता के लिए रखा है), अब मूर्खतापूर्ण दिखता है :)

असल में, ऐसा होता है जब एक मॉडल पोस्ट किया जाता है और मॉडल को उसी पृष्ठ पर वापस लौटा दिया जाता है।

निम्न कोड खंड का उपयोग करके इनपुट हेल्पर विधि (InputExtensions.cs) में मान को एक्सेस किया गया है (और HTML में बनाया गया है)

string attemptedValue = (string)htmlHelper.GetModelStateValue(fullName, typeof(string));

GetModelStateValue विधि (Htmlelper.cs में) मान को पुनर्प्राप्त करता है

ViewData.ModelState.TryGetValue(key, out modelState)

यहां समस्या है, क्योंकि मूल्य को ViewData.ModelState शब्दकोश से एक्सेस किया गया है। यह संशोधित मूल्य के बजाय पृष्ठ से पोस्ट मूल्य लौटाता है !!

यानी यदि वेरिएबल का आपका पोस्ट वैल्यू (उदाहरण के लिए Person.Id) 0 है, लेकिन आप httpPost action (जैसे Person.Id = 2) के अंदर मान सेट करते हैं, तो मॉडलस्टेट अभी भी पुराने मान को "0" बनाए रखता है और प्रयास में "0" ! इसलिए प्रस्तुत पृष्ठ में फ़ील्ड में "0" मान के रूप में होगा !!

यदि आप एक ही पृष्ठ पर मॉडल लौट रहे हैं तो वर्कअराउंड: मॉडलस्टेट से आइटम साफ़ करें, उदाहरण के लिए ModelState.Remove ("Id");

यह आइटम को शब्दकोश से हटा देगा और ViewData.ModelState.TryGetValue (कुंजी, आउट मॉडलस्टेट) शून्य लौटाता है , और अगला कथन (InputExtensions.cs के अंदर) वास्तविक मान (मान पैरामीटर ) को छुपा हुआ है (m => m.Id )

यह InputExtensions.cs में निम्न पंक्ति में किया जाता है

tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(fullName, format) : valueParameter), isExplicitValue);

सारांश: ModelState.Remove ("...") का उपयोग कर मॉडलस्टेट में आइटम साफ़ करें;

उम्मीद है कि यह सहायक है।


इस सवाल को ध्यान में रखते हुए क्योंकि मैंने हाल ही में किसी समस्या को एक मौजूदा इकाई में जोड़ने की कोशिश करते समय समस्या में भाग लिया था। मैं बस एक अच्छा विस्तार विधि बनाने समाप्त हो गया:

    public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, TProperty value)
    {
        string expressionText = ExpressionHelper.GetExpressionText(expression);
        string propertyName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expressionText);

        return htmlHelper.Hidden(propertyName, value);
    }

इस तरह प्रयोग करें:

@Html.HiddenFor(m => m.RELATED_ID, Related.Id)

ध्यान दें कि इसमें अंतर्निहित छुपा फोर के लिए एक समान हस्ताक्षर है, लेकिन जेनेरिक टाइपिंग का उपयोग करता है, इसलिए यदि मान सिस्टम का प्रकार है। ऑब्जेक्ट, तो आप वास्तव में ढांचे में बने एक को आविष्कार करेंगे। निश्चित नहीं है कि आप सिस्टम की प्रकार की संपत्ति क्यों संपादित करेंगे। हालांकि आपके विचारों में ऑब्जेक्ट करें ...


छिपे हुए क्षेत्र में मूल्य निर्धारित करने के लिए निम्न तरीके से कार्य करें:

@Html.HiddenFor(model => model.title, 
                new { id= "natureOfVisitField", Value = @Model.title})

यह काम करेगा





html.hiddenfor