এইচটিএমএল.অ্যাকশনলিঙ্ক কেন "? দৈর্ঘ্য = 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 () পদ্ধতিগুলির সাথেও উপস্থিত হয় appears
জনাথন ওয়াটনি

উত্তর:


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" })

@ ব্লা_ব্লাহ আজকাল আমি এটি মোটেও ব্যবহার করি না, আমার নিজের <a> ট্যাগ লিখতে এবং কেবল ইউআরএল ব্যবহার করতে পছন্দ করি ction অ্যাকশন ("অ্যাকশন", "কন্ট্রোলার")
ররিফ

@ ররিফ কোনও উদ্বেগ নেই ... এটি একটি কোড পর্যালোচনায় সেরা অভ্যাস হিসাবে ব্যবহৃত হয়েছিল, তারা তারিখটি পরীক্ষা করে নি। তারিখের মধ্যে
স্ট্যাকওভারফ্লো

দুর্দান্ত উত্তর। এটি যুক্ত করার জন্য একই কারণে এইচটিএমএল.বেগিনআর্টফর্মেও ঘটে। Html.BeginRouteForm ( "রুট", "অ্যাকশন", FormMethod.Post)) হওয়া উচিত Html.BeginRouteForm ( "রুট", নতুন {কর্ম = "AgentSignUp"}, FormMethod.Post) যে অদ্ভুত দৈর্ঘ্য জিনিস পরিত্রাণ পায়
radm4

সাথে ঘটে 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" })

আপনি যদি অঞ্চলের সাথে সংযোগ স্থাপন না করেন তবে এটি সেরা উত্তর। আপনি যদি লিঙ্কটির জন্য অঞ্চলটি নির্দিষ্ট করতে চান তবে আপনাকে ইউআরএলটিতে দৈর্ঘ্যের বৈশিষ্ট্যটি প্রদর্শন controllerনা areaকরার জন্য এবং এর সাথে রুটভ্যালুগুলি নির্দিষ্ট করতে হবে।
জন ওয়াশাম

@ জোহনওয়াশাম আসলে, আপনাকে routeValuesকেবলমাত্র অঞ্চলে নিয়ন্ত্রণকারী নির্দিষ্ট করার দরকার নেই । উদাহরণস্বরূপ:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
এপিপ্লন

1
@ পেপলন, আমি এর মতো নিয়ামক নির্দিষ্ট করার কারণ হ'ল আপনি যদি কখনও htmlAtributes এর শেষ যুক্তি হিসাবে অন্তর্ভুক্ত না করেন তবে ActionLinkএমভিসি 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ইউআরএলে রাখবে না ।
জন ওয়াশাম

@epiplon, এছাড়াও আপনি ব্যবহার করতে প্রয়োজন হবে না @যে @area = "Admin", ঠিক তাই আপনি জানেন।
জন ওয়াশাম

88

আপনি এইচটিএমএলট্রিবিউটস পারম যুক্ত করতে ভুলে গেছেন।

এটি কোনও পরিবর্তন ছাড়াই কাজ করবে:

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

আমি জানি না, কেন এটি আমার জন্য কাজ করা হয় না i আমি "নতুন {হাইডফোকাস =" "}" দিয়ে চেষ্টা করেছি, এবং এটি আমার পক্ষে কাজ করে।
নরেদেলা নীতেশ রেড্ডি

28

অ্যাকশনলিঙ্কের প্যারামিটারগুলি সঠিক নয়, এটি বেনামে টাইপের পরিবর্তে "হোম" মানটিকে রুটের মান হিসাবে ব্যবহার করার চেষ্টা করছে।

আমি বিশ্বাস করি আপনি শুধু যোগ করতে হবে new { }বা nullশেষ প্যারামিটার হিসাবে।

সম্পাদনা: স্রেফ পোস্টটি পুনরায় পড়ুন এবং বুঝতে পেরেছেন যে আপনি সম্ভবত নালকে দ্বিতীয় শেষ প্যারামিটার হিসাবে উল্লেখ করতে চান, শেষ নয় not


1
বিটিডাব্লু তাদের একটি পদ্ধতি অপসারণ করা উচিত কারণ এটি ব্যবহার করা সম্ভব নয়!
মার্ক ক্লাইমেন্ট

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

এটি ওভারলোডটি নেবে: স্ট্রিং লিঙ্কটেক্সট, স্ট্রিং অ্যাকশননাম, স্ট্রিং কন্ট্রোলার নাম, অবজেক্ট রুটভ্যালু, অবজেক্ট এইচটিএমএল


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 ()

পদ্ধতি। আমার ক্ষেত্রে, আমি সংশ্লিষ্ট কন্ট্রোলার + তৈরি করুন ক্রিয়াকলাপের পোস্ট অনুরোধটিকে লক্ষ্য করে একটি ক্রিয়েট সিটিএসটিএমএলে ছিলাম এবং ছিল

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

রেন্ডার করার সময় কোনটি ফর্ম ক্রিয়ায় "? দৈর্ঘ্য = 6" যুক্ত করেছিল ? ররিফের অনুমোদিত উত্তরের দ্বারা ইঙ্গিত দেওয়া এবং "তৈরি করুন" এর স্ট্রিং দৈর্ঘ্য 6 টি বুঝতে পেরে অবশেষে আমি সুস্পষ্ট ক্রিয়া বিশদটি সরিয়ে এটি সমাধান করেছি:

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

0

সম্ভবত অন্যেরও একই সমস্যা ছিল এবং এইচটিএমএলটি্রিবিউটস পারমের মাধ্যমে একটি শ্রেণীর মান সরবরাহ করা দরকার । এখানে আমার সমাধান:

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


0

আমার প্রশ্নের উত্তর অনুসন্ধানের জন্য আমাকে এখানে পৌঁছেছে, মূলত এটি সঠিক ওভারলোডের নির্বাচন @Html.ActionLink এখানে চিত্র বর্ণনা লিখুন যা গুরুত্বপূর্ণ।
আমি একজন জমিদার যার কোন অস্তিত্ব না, (নির্বাচন হয়েছিল ছাড়া গত null ), এবংMVC এমন কোন জমিদার ছিল, অপ উল্লেখ মত একটি মিথ্যা URL টি কিছু দেখার সংখ্যা।

একটি ব্যক্তিগত নোট: আপনি useবেনামে প্রকারের অর্থ এই নয় যে আপনি কোনও ওভারলোড ব্যবহার করতে পারবেন- যা বিদ্যমান নেই? - নির্দিষ্ট করুন: এটা হয়েছে সংজ্ঞায়িত করা!
- এমভিসি 5.2 এর সময়ে এখানে এসেছিল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.