2012-09-03 14 views

उत्तर

19

आपको विशेषता पैरामीटर में मान सेट करने की आवश्यकता नहीं है। एमवीसी स्वचालित रूप से इसे आपके लिए बांधना चाहिए।

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

यह काम नहीं करता है! – arnoldrob

+0

यह ठीक है लेकिन मैं एक बड़ी गलती करता हूं! माफ़ कीजिये! धन्यवाद – arnoldrob

+0

यह एमवीसी 4 में काम नहीं करता है। –

7

यह सिर्फ पैसे, @value नहीं है .. यह कोशिश करो। मैं के बारे में @ Model.title यकीन नहीं है, हो सकता है यह सिर्फ Model.title

+0

यह काम नहीं करता है! – arnoldrob

+0

@arnoldrob क्या आपने दोनों को आजमाया? यह तरह दिखना चाहिए: @ Html.HiddenFor (मॉडल => model.title, नए {आईडी = "natureOfVisitField", मान = '@ Model.title'}) या सिर्फ Model.title अंत में .. यह मेरी परियोजना में चलता है –

+0

मैंने कोशिश की लेकिन यह काम नहीं करता है! कोई बात नहीं धन्यवाद! – arnoldrob

62

है छिपा क्षेत्र में मान सेट के लिए निम्नलिखित तरीके से कार्य करें:

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

यह

+0

यह काम करता है, धन्यवाद। – Anthony

+0

एमवीसी 3 में काम करेगा? –

+0

मुझे पता है कि मैं इसके साथ 2 साल से अधिक देर से हूं, लेकिन यह ध्यान रखना महत्वपूर्ण है कि इसके साथ प्रदान किए गए एचटीएमएल टैग में 'वैल्यू' और 'वैल्यू' टैग होंगे। आप 'value' का उपयोग करना चाहते हैं क्योंकि वह स्थान है जहां नियंत्रक आपके डेटा की खोज करेगा – Ortund

3

काम करेंगे इस सवाल Necroing क्योंकि हाल ही में किसी मौजूदा इकाई में संबंधित संपत्ति जोड़ने की कोशिश करते समय, मैंने हाल ही में समस्या में भाग लिया।

तो जैसे
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) 

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

24

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

उदा (MVC4 पर काम कर)

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

अद्यतन:

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

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


अद्यतन, यह कैसे काम करता है आंतरिक रूप से अध्ययन करने के बाद:

सबसे पहले इन सभी समाधानों भूल (मैं निरंतरता यहाँ की खातिर में रखा है), अब लग रहा है मूर्ख :)

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

मूल्य पहुँचा (और html में गठित) InputHelper विधि (InputExtensions.cs) का उपयोग करने में किया जाता है कोड टुकड़ा

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 से आइटम साफ़ करें, उदा ModelState.Remove ("आईडी");

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

इस InputExtensions.cs में

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

सारांश निम्न पंक्ति में किया जाता है: ModelState.Remove ("...") का उपयोग कर ModelState में आइटम को साफ़ करें;

आशा है कि यह सहायक होगा।

+0

मूल्य मेरे लिए काम किया आप .think – aboamin12

+0

है मैं इस बहुत ही अजीब लगता है, लेकिन यह सही हो रहा है। मैंने अपने नियंत्रक में ModelState.Remove ("") जोड़ा और मेरी समस्या दूर हो गई। – RitchieD

+0

ग्रेट कैच। इस समस्या को ट्रैक करने के लिए कुछ समय और यह जवाब लिया। यह मुझे चिंतित करता है कि मैंने इस तरह की कुछ अन्य सूक्ष्मताओं को याद किया होगा। –

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