Html.ActionLink क्यों प्रस्तुत करता है "? लंबाई = 4"


305

मैं बहुत क्यों इस कोड के रूप में उलझन में हूँ

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })

इस लिंक में परिणाम:

<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>

hidefocusभाग मैं क्या हासिल करने का लक्ष्य दिया गया था, लेकिन जहां है ?Length=4से आते हैं?


4
यह व्यवहार Html.BeginForm () विधियों के साथ भी दिखाई देता है।
जोनाथन वाटनी

जवाबों:


326

लंबाई = 4 एक स्ट्रिंग ऑब्जेक्ट को क्रमबद्ध करने के प्रयास से आ रही है। आपका कोड इस ActionLinkविधि को चला रहा है :

public static string ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes)

यह stringरूटवैल्यूस के लिए एक ऑब्जेक्ट "होम" लेता है , जिसे एमवीसी नलसाजी सार्वजनिक गुणों के लिए खोजता है जो उन्हें रूट वैल्यू में बदल देता है। किसी stringवस्तु के मामले में , केवल सार्वजनिक संपत्ति होती है Length, और चूंकि कोई लंबाई पैरामीटर के साथ परिभाषित कोई मार्ग नहीं होगा, यह संपत्ति का नाम और मान को क्वेरी स्ट्रिंग पैरामीटर के रूप में जोड़ता है। आप शायद यह पाएंगे कि यदि आप HomeControllerइसे एक पृष्ठ से चलाते हैं, तो यह एक लापता Aboutक्रिया पद्धति के बारे में त्रुटि नहीं देगा । निम्नलिखित का उपयोग करके देखें:

Html.ActionLink("About", "About", new { controller = "Home" }, new { hidefocus = "hidefocus" })

इन दिनों @Blah_Blah मैं सब पर इस का उपयोग नहीं करते, मेरे अपने <a> टैग लेखन पसंद करते हैं और सिर्फ Url.Action का उपयोग कर ( "कार्रवाई", "नियंत्रक")
roryf

@roryf कोई चिंता नहीं ... यह एक कोड समीक्षा में एक सर्वोत्तम प्रथाओं के रूप में इस्तेमाल किया गया था, उन्होंने तारीख की जांच नहीं की। वास्तव में
स्टैकओवरफ़्लो

बहुत बढ़िया जवाब। बस इसे जोड़ने के लिए भी इसी कारण से Html.BeginRouteForm पर होता है। Html.BeginRouteForm ("रूट", "एक्शन", फॉर्ममेथोड.पोस्ट)) Html.BeginRouteForm ("रूट", नया {एक्शन = "AgentSignPp"}, फॉर्ममेथोड.पोस्ट) होना चाहिए, जो अजीब लंबाई की चीज से छुटकारा
दिलाता है

के साथ भी होता है Url.Action()। लंबाई संपत्ति को दिखाने से Url.Action("Action", "Controller", new { area = "" })रखने से बदलने के लिए Url.Action("Action", new { controller = "Controller", area = "" })
जॉन वाशम

उन प्रकार की स्थिति से बचने के लिए, आप हमेशा निर्दिष्ट कर सकते हैं कि आप कौन से पैरामीटर पास कर रहे हैं, जैसे:Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
एपीप्लॉन

195

जिस तरह से मैंने इसे हल किया वह अनाम घोषणा ( new {}) से पहले चौथे पैरामीटर में एक शून्य जोड़ रहा था ताकि यह निम्नलिखित विधि अधिभार का उपयोग करे:

Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" })

यदि आप क्षेत्रों के बीच लिंक नहीं कर रहे हैं तो यह सबसे अच्छा उत्तर है। यदि आपको लिंक के लिए क्षेत्र निर्दिष्ट करने की आवश्यकता है, तो आपको URL में दिखाए जाने से लंबाई की संपत्ति को रखने के लिए controllerऔर साथ मार्गों को निर्दिष्ट करना होगा area
जॉन वाशम

@ जोहानशम वास्तव में, आपको नियंत्रक को routeValuesकेवल क्षेत्र में निर्दिष्ट करने की आवश्यकता नहीं है । उदाहरण के लिए:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
एपीप्लोन

1
@epiplon, इसका कारण मैं उस नियंत्रक को निर्दिष्ट करता हूं, क्योंकि यदि आपने htmlAttributes को अंतिम तर्क के रूप में कभी शामिल नहीं किया है ActionLink, तो MVC Length=xURL के अंत में एक अजीब पैरामीटर शामिल करेगा । उदाहरण के लिए, इसे एक पृष्ठ पर रखें, फिर अपने पृष्ठ के स्रोत को देखें, और आप देखेंगे कि मेरा क्या मतलब है: @Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" }) @Html.ActionLink("About", "About", "Home", new { area = "Admin" }) लेकिन यदि आप controllerप्रविष्टि डालते हैं routeValues, तो यह कभी Length=xभी URL में नहीं डाली जाएगी ।
जॉन वाशम

@epiplon, आपको भी उपयोग करने की आवश्यकता नहीं @है @area = "Admin", बस आपको पता है।
जॉन वाशम

88

आप HTMLAttributes parm जोड़ना भूल गए।

यह बिना किसी बदलाव के काम करेगा:

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)

मुझे नहीं पता, मेरे लिए यह काम क्यों नहीं किया गया। मैंने "नए {Hidefocus =" "}" के साथ प्रयास किया, और यह मेरे लिए काम करता है।
नरडला निथेश रेड्डी

28

ActionLink के पैरामीटर सही नहीं हैं, यह "होम" मान को रूट प्रकार के बजाय अनाम प्रकार के रूप में उपयोग करने का प्रयास कर रहा है।

मेरा मानना ​​है कि आपको केवल अंतिम पैरामीटर के रूप में new { }या जोड़ने की आवश्यकता है null

संपादित करें: बस पोस्ट को फिर से पढ़ें और महसूस किया कि आप संभवतः दूसरे अंतिम पैरामीटर के रूप में शून्य को निर्दिष्ट करना चाहते हैं, अंतिम नहीं।


1
BTW उन्हें एक विधि को हटा देना चाहिए क्योंकि इसका उपयोग करना संभव नहीं है!
मार्क क्लाइमेंट

5
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { })

यह अधिभार लेगा: स्ट्रिंग लिंकटेक्स्ट, स्ट्रिंग एक्शननाम, स्ट्रिंग कंट्रोलरनाम, ऑब्जेक्ट रूटवैल्यूज़, ऑब्जेक्ट htmlArributes


3

कृपया पाँच (5) मापदंडों के साथ सही ओवरलोड विधि का उपयोग करें। उदाहरण:

@using (@Ajax.BeginForm("Register", "Account", null,
    new AjaxOptions
    {
        HttpMethod = "POST",
        OnSuccess = "OnSuccess",
        OnFailure = "OnFailure",
        OnBegin = "OnBegin",
        OnComplete = "OnComplete"
    }, new { @class = "form-login" }))

नियंत्रक नाम के बाद अशक्त जोड़ना मेरे मामले में मददगार था।
मुनम यूसुफ

यह प्रभावी रूप से जोड़े गए बोनस के साथ @ जेसी के जवाब के रूप में एक ही उत्तर है कि यह अजाक्स संस्करण को कवर करता है, जो कि ओपी ने नहीं पूछा था, लेकिन यह उसी मुद्दे से संबंधित है।
gcoulby

2

बस "होम" (नियंत्रक का नाम) को हटा दें ताकि कोड हो:

Html.ActionLink("About", "About", new { hidefocus = "hidefocus" })

1

विशेषता नामों के साथ:

 @Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null)

0

जैसा कि जोनाथन वाटनी ने एक टिप्पणी में बताया, यह भी जाता है

Html.BeginForm ()

तरीकों। मेरे मामले में, मैं एक Create.cshtml में संबंधित कंट्रोलर + क्रिएट एक्शन और के पोस्ट अनुरोध को लक्षित कर रहा था

using (Html.BeginForm("Create")) {
  @Html.AntiForgeryToken()
  ...
}

जब रेंडरिंग क्रिया के लिए "लंबाई? 6" जोड़ रहा था । Roryf के स्वीकृत जवाब से संकेत मिलता है और "Create" की स्ट्रिंग लंबाई का एहसास 6 है, मैंने अंत में स्पष्ट विवरण विनिर्देश को हटाकर इसे हल किया:

using (Html.BeginForm()) {
      @Html.AntiForgeryToken()
      ...
    }

0

शायद दूसरों के पास एक ही मुद्दा था और HTMLAttributes parm के माध्यम से एक वर्ग मूल्य की आपूर्ति करने की आवश्यकता थी । यहाँ मेरा समाधान है:

@Html.ActionLink("About", "About", new { controller = "Home", area = "" }, new { hidefocus = "hidefocus", @class = "nav-item nav-link" })


0

मेरे प्रश्न का उत्तर खोजने के लिए मुझे यहाँ उतरा, मूल रूप से यह सही अधिभार का चयन है @Html.ActionLink यहां छवि विवरण दर्ज करें जो मायने रखता है।
मैं एक अधिभार जो अस्तित्व में नहीं था, (का चयन किया गया था के बिना पिछले null ), और MVCऐसी कोई अधिभार था, ओपी उल्लेख की तरह एक झूठी यूआरएल कुछ हो जाती है।

एक व्यक्तिगत टिप्पणी: आप useगुमनाम प्रकार का मतलब यह नहीं कर सकते हैं कि आप किसी भी अधिभार का उपयोग कर सकते हैं- जो मौजूद नहीं है? - कुछ हो जाता है: यह है परिभाषित किया जा करने के लिए!
- एमवीसी 5.2 के समय में यहां आया था

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.