ASP.NET MVC HTML.ActionLink () حفظ قيمة الطريق لا أريد
-
13-09-2019 - |
سؤال
لدي ActionLink التالي في رأيي
<%= Html.ActionLink("LinkText", "Action", "Controller"); %>
ويخلق عنوان URL التالي http://mywebsite.com/controllers.
قل أنا أضف معرف في النهاية مثل ذلك: http://mywebsite.com/controller/action/53. والانتقال إلى الصفحة. في هذه الصفحة لدي العلامات التي حددتها أعلاه. الآن عندما أنظر إلى عنوان URL، فهذا يشبه هذا:
http://mywebsite.com/controller/action/53. (لاحظ إضافة المعرف)
لكنني أريدها أن أزال المعرف وتبدو كما فعلت في الأصل، مثل هذا http://mywebsite.com/controllers. (لاحظ عدم وجود معرف هنا)
أي أفكار كيف يمكنني إصلاح هذا؟ لا أريد استخدام عناوين URL المشفرة الثابت منذ قد تتغير وحدة التحكم / الإجراءات الخاصة بي.
المحلول
الحل هو تحديد قيم الطريق الخاصة بي (المعلمة الثالثة أدناه)
<%= Html.ActionLink("LinkText", "Action", "Controller",
new { id=string.Empty }, null) %>
نصائح أخرى
يبدو أنك بحاجة إلى تسجيل طريق "الإجراء فقط" الثاني واستخدام HTML.RoutElink (). أولا تسجيل مسار مثل هذا في تطبيق بدء التشغيل:
routes.MapRoute("ActionOnly", "{controller}/{action}",
new { controller = "Home", action = "Index" } );
ثم بدلا من ActionLink لإنشاء استخدام هذه الروابط:
Html.RouteLink("About","ActionOnly")
المشكلة هي الطريقة التي تم إنشاؤها في المدخلات من عنوان URL الخاص بك حاليا بالإضافة إلى ما تقدمه. يمكنك تجربة هذا:
<%= Html.ActionLink("LinkText", "Action", "Controller", new { id = ""}) %>
يجب أن مسح يدويا معلمة الهوية يدويا.
لا أعرف لماذا، لكنها لم تنجح بالنسبة لي (ربما بسبب MVC2 RC). تم إنشاء طريقة URLHELPER =>
public static string
WithoutRouteValues(this UrlHelper helper, ActionResult action,params string[] routeValues)
{
var rv = helper.RequestContext.RouteData.Values;
var ignoredValues = rv.Where(x=>routeValues.Any(z => z == x.Key)).ToList();
foreach (var ignoredValue in ignoredValues)
rv.Remove(ignoredValue.Key);
var res = helper.Action(action);
foreach (var ignoredValue in ignoredValues)
rv.Add(ignoredValue.Key, ignoredValue.Value);
return res;
}
إذا كنت كذلك لا تعرف القيم التي تحتاج إلى تجاوزها صراحة أو تريد فقط تجنب قائمة المعلمات الإضافية، يمكنك استخدام طريقة تمديد مثل أدناه.
<a href="@Url.Isolate(u => u.Action("View", "Person"))">View</a>
تفاصيل التنفيذ هي في هذا آخر بلوق
أقوم بتعيين اسم الإجراء بشكل صريح ك "إجراء /". يبدو قليلا مثل الاختراق ولكنه حل سريع.
@Html.ActionLink("Link Name", "Action/", "Controller")
طريقة أخرى هي استخدام ActionLink (HTMLHELPER، السلسلة، السلسلة، Routevaluedictionary)، إذا لم تكن هناك حاجة لوضع NULL في المعلمة الأخيرة
<%= Html.ActionLink("Details", "Details", "Product", new RouteValueDictionary(new { id=item.ID })) %>
يتم تغيير الحمل الزائد من HTML.ActionLink في الإصدارات الأحدث من MVC. على MVC 5 وما فوق. هذا هو كيفية القيام بذلك:
@Html.ActionLink("LinkText", "Action", "Controller", new { id = "" }, null)
ملاحظة مررت ب "معلمة الهوية واغتالية ل htmlattributes.
كنت بحاجة إلى روابط القائمة الخاصة بي لتكون ديناميكية. بدلا من تنفيذ الكثير من التعليمات البرمجية الإضافية والتوجيه لكل صفحة واحدة أنا بسيطة تم الاستغناء عن مساعد HTML.
<a href="@(item.websiteBaseURL)/@(item.controller)/@(item.ViewName)">@item.MenuItemName</a>