asp.net-mvc - يوتيوب - معلمات عنوان url




إنشاء عنوان URL في مساعد HTML (2)

عادة في طريقة عرض ASP.NET ، يمكن للمرء استخدام الوظيفة التالية للحصول على عنوان URL (وليس <a> ):

Url.Action("Action", "Controller");

ومع ذلك ، لا يمكنني العثور على كيفية القيام بذلك من مساعد HTML مخصص. عندي

public class MyCustomHelper
{
   public static string ExtensionMethod(this HtmlHelper helper)
   {
   }
}

يحتوي المتغير المساعد على أساليب Action و GenerateLink ، لكنه ينشئ <a> . فعلت بعض الحفر في شفرة المصدر ASP.NET MVC ، ولكن لم أتمكن من العثور على طريقة واضحة.

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

باختصار ، أعتقد أنه من الممكن ولكن بما أن جميع الطرق التي يمكن أن أراها ، تنطوي على بعض التلاعب مع بعض الأشياء ASP.NET الداخلية أكثر أو أقل ، وأنا أتساءل عما إذا كان هناك طريقة أفضل.

تعديل: على سبيل المثال ، أحد الاحتمالات التي أراها سيكون:

public class MyCustomHelper
{
    public static string ExtensionMethod(this HtmlHelper helper)
    {
        UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
        urlHelper.Action("Action", "Controller");
    }
}

لكن هذا لا يبدو صحيحا. لا أريد أن أتعامل مع حالات UrlHelper بنفسي. يجب أن يكون هناك طريقة أسهل.


هنا هو بلدي extenstion طريقة صغيرة للحصول على UrlHelper من مثيل HtmlHelper :

  public static partial class UrlHelperExtensions
    {
        /// <summary>
        /// Gets UrlHelper for the HtmlHelper.
        /// </summary>
        /// <param name="htmlHelper">The HTML helper.</param>
        /// <returns></returns>
        public static UrlHelper UrlHelper(this HtmlHelper htmlHelper)
        {
            if (htmlHelper.ViewContext.Controller is Controller)
                return ((Controller)htmlHelper.ViewContext.Controller).Url;

            const string itemKey = "HtmlHelper_UrlHelper";

            if (htmlHelper.ViewContext.HttpContext.Items[itemKey] == null)
                htmlHelper.ViewContext.HttpContext.Items[itemKey] = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);

            return (UrlHelper)htmlHelper.ViewContext.HttpContext.Items[itemKey];
        }
    }

استخدمه على النحو التالي:

public static MvcHtmlString RenderManagePrintLink(this HtmlHelper helper, )
{    
    var url = htmlHelper.UrlHelper().RouteUrl('routeName');
    //...
}

(أنا نشر هذا الجواب كمرجع فقط)


يمكنك أيضًا الحصول على الروابط باستخدام UrlHelper public و class ثابت:

UrlHelper.GenerateUrl(null, actionName, controllerName, null, null, null, routeValues, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true)

في هذا المثال ، لا يتعين عليك إنشاء فئة UrlHelper جديدة لما قد يكون ميزة صغيرة.





html-helper