2010-11-16 10 views
12

मेरे दृश्य इस तरह दिखता है:ASP.NET MVC - मुसीबत Html.ActionLink routeValues ​​में मॉडल गुजर

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<TMS.MVC.BusinessSystemsSupport.Models.SearchDataTypeModel>" %> 


<table class="classQueryResultsTable"> 
    <!-- the header --> 
    <tr class="headerRow"> 

     <td> 
     <%= Html.ActionLink("Effective Startdate", 
        "SortDetails", 
        "DataQryUpdate", 
        new 
        { 
         model = Model, 
         sortBy = "EffectiveStartDate", 
        }, 
        new { @class = "classLinkLogDetails" })%> 
     </td> 

    </tr> 


</table> 

मेरे नियंत्रक कार्रवाई:

public ActionResult SortDetails(SearchDataTypeModel model, String sortBy) 
    { 

मॉडल पैरामीटर रिक्त है। SortBy पैरामीटर आबादी है। मैं मॉडल से स्ट्रिंग प्रॉपर्टी में बिना किसी समस्या के कार्रवाई कर सकता हूं। हालांकि मैं पूरे मॉडल में पास करना चाहता हूं।

कोई विचार क्या मैं गलत कर रहा हूं?

उत्तर

3

एक अन्य विकल्प TempData में आवश्यक डेटा को बनाए रखना है। यह इसे अगले अनुरोध पर सौंप देगा, और आप इसे वहां पुनर्प्राप्त कर सकते हैं। यदि आप चाहें तो आपको पूरे मॉडल ऑब्जेक्ट को जारी रखने में सक्षम होना चाहिए।

लेकिन डेटाबेस से फिर से इसे पुनः प्राप्त करने के लिए यह आसान (और बेहतर अभ्यास) है, जैसा कि डारिन बताते हैं।

+1

TempData केवल तभी उपयोग किया जाना चाहिए जब पुनर्निर्देशित कार्रवाई में TempData से संग्रहीत और प्राप्त किए जाने के बाद तुरंत रीडायरेक्ट किया जाए। मैं इस परिदृश्य में इसका उपयोग नहीं करता। –

17

आप जटिल वस्तुओं पारित नहीं कर सकते हैं:

new 
{ 
    model = Model, 
    sortBy = "EffectiveStartDate", 
}, 

model = Model कोई मतलब नहीं है और प्राप्त का उपयोग कर नहीं भेजा जा सकता। आपको सभी मॉडल गुण भेजने के लिए एक संपादक टेम्पलेट और/या छिपे हुए फ़ील्ड वाले फ़ॉर्म का उपयोग करने की आवश्यकता हो सकती है। याद रखें केवल स्केलर मान क्वेरी स्ट्रिंग में भेजा जा सकता है (key1 = value1 & key2 = value2 ...)।

new 
{ 
    modelId = Model.Id, 
    sortBy = "EffectiveStartDate", 
}, 

और अपने नियंत्रक कार्रवाई मॉडल अपने डेटा की दुकान से इस आईडी दी लाने में:

public ActionResult SortDetails(int modelId, String sortBy) 
{ 
    var model = repository.GetModel(modelId); 
    ... 
} 
बेशक

यह केवल सच है, तो है एक अन्य विकल्प जो मन में आता ही आईडी भेजने के लिए है उपयोगकर्ता को किसी प्रपत्र में मॉडल गुणों को संपादित नहीं करना चाहिए। आपके परिदृश्य पर निर्भर करता है।

और पूर्णता के लिए मुझे एक और विकल्प का पर्दाफाश करने दें: Html.Serialize एमवीसी फ्यूचर्स से सहायक को पूरे मॉडल को एक छिपे हुए क्षेत्र में क्रमबद्ध करने के लिए उपयोग करें जिसे नियंत्रक कार्रवाई में वापस भेज दिया जा सकता है और वहां deserialized किया जा सकता है।

+0

तो मूल रूप से सरल स्ट्रिंग केवल मानकों? –

+3

हाँ, सरल स्ट्रिंग, इस तरह HTTP प्रोटोकॉल काम करता है। एक अन्य विकल्प केवल आईडी भेजता है और नियंत्रक कार्रवाई में डेटा को स्टोर से अपने आईडी को लाने के लिए एक संग्रह का उपयोग किया जाता है। मॉडल के अंदर –

+0

@ डारिन, मॉडल आईडी = मॉडल.आईडी, मॉडल के अंदर आईडी (सूची के दूसरे मॉडल) में क्या है? @ Html.DisplayFor (मॉडल => model.innerModel [i] नाम) की तरह और अब ", false) });