سؤال

أريد أن أكتب htmlhelper لتقديم ActionLink مع القيم المحددة مسبقًا ، على سبيل المثال.

<%=Html.PageLink("Page 1", "page-slug");%>

أين PageLink هي وظيفة تستدعي ActionLink مع إجراء معروف ووحدة تحكم ، على سبيل المثال. "الفهرس" و "الصفحة".

حيث HtmlHelper و UrlHelper لا توجد داخل أ Controller أو الفصل ، كيف يمكنني الحصول على عنوان URL النسبي إلى إجراء من داخل الفصل؟

تحديث: بالنظر إلى ثلاث سنوات إضافية من الخبرة المستحقة التي أمتلكها الآن ، إليك نصيحتي: فقط استخدم Html.ActionLink("My Link", new { controller = "Page", slug = "page-slug" }) أو الأفضل من ذلك،

<a href="@Url.Action("ViewPage",
                     new {
                           controller = "Page",
                           slug = "my-page-slug" })">My Link</a>

قد تكون طريقة التمديد الخاصة بك لطيفة وقصيرة ، لكنها تضيف نقطة أخرى لم يتم اختبارها ومتطلبات تعليمية جديدة للتعيينات دون إضافة أي قيمة حقيقية على الإطلاق. فكر في الأمر على أنه تصميم نظام معقد. لماذا إضافة جزء متحرك آخر ، ما لم يضيف الموثوقية (لا) ، قابلية القراءة (القليل ، بمجرد قراءتك أكثر المستندات) ، السرعة (لا شيء) أو التزامن (لا شيء).

هل كانت مفيدة؟

المحلول

لست متأكدًا من أنني فهمت سؤالك بوضوح ، لكن دعني أحاول.

لإنشاء امتداد htmlhelper كما وصفته ، جرب شيء مثل:

using System;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace Something {
    public static class PageLinkHelper
    {
        public static string PageLink(
            this HtmlHelper helper,
            string linkText, string actionName,
            string controllerName, object routeValues,
            object htmlAttributes)
        {
            return helper.ActionLink(
                linkText, actionName, controllerName,
                routeValues, htmlAttributes);
        }
    }
}

بالنسبة لسؤالك حول الحصول على عنوان URL من الفصل ، يعتمد على نوع الفصل الذي ستنفذه. على سبيل المثال ، إذا كنت ترغب في الحصول على وحدة التحكم الحالية والعمل من امتداد HTMLHelper ، فيمكنك استخدام:

string currentControllerName = (string)helper.ViewContext
    .RouteData.Values["controller"];
string currentActionName = (string)helper.ViewContext
    .RouteData.Values["action"];

إذا كنت ترغب في الحصول عليها من وحدة تحكم ، فيمكنك استخدام الخصائص/الأساليب من الفئة الأساسية (وحدة التحكم) لإنشاء عنوان URL. علي سبيل المثال:

var url = new UrlHelper(this.ControllerContext.RequestContext);
url.Action(an_action_name, route_values);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top