كيف يمكنني الوصول إلى أساليب HtmlHelper من داخل MY OWN HtmlHelper؟

StackOverflow https://stackoverflow.com/questions/494345

  •  20-08-2019
  •  | 
  •  

سؤال

أنا أكتب ملحق HtmlHelper الخاص بي لـ ASP.NET MVC:

public static string CreateDialogLink (this HtmlHelper htmlHelper, string linkText, 
                                      string contentPath)
        {
            // fix up content path if the user supplied a path beginning with '~'
            contentPath = Url.Content(contentPath);  // doesn't work (see below for why)

            // create the link and return it
            // .....
        };

المكان الذي أواجه فيه مشكلة هو محاولة الوصول UrlHelper من داخل تعريف HtmlHelper الخاص بي.المشكلة هي أن الطريقة التي تصل بها عادة HtmlHelper (عبر Html.MethodName(...) ) عبر خاصية في المنظر.من الواضح أن هذا غير متاح لي من خلال فصل الإرشاد الخاص بي.

هذا هو كود مصدر MVC الفعلي لـ ViewMasterPage (اعتبارًا من الإصدار التجريبي) - الذي يحدد Html و Url.

public class ViewMasterPage : MasterPage
    {
        public ViewMasterPage();

        public AjaxHelper Ajax { get; }
        public HtmlHelper Html { get; }
        public object Model { get; }
        public TempDataDictionary TempData { get; }
        public UrlHelper Url { get; }
        public ViewContext ViewContext { get; }
        public ViewDataDictionary ViewData { get; }
        public HtmlTextWriter Writer { get; }
    }

أريد أن أكون قادرًا على الوصول إلى هذه الخصائص داخل HtmlHelper.

أفضل ما توصلت إليه هو هذا (أدخل في بداية CreateDialogLink طريقة)

HtmlHelper Html = new HtmlHelper(htmlHelper.ViewContext, htmlHelper.ViewDataContainer);
UrlHelper Url = new UrlHelper(htmlHelper.ViewContext.RequestContext);

هل أفتقد طريقة أخرى للوصول إلى الموجود HtmlHelper و UrlHelper مثيلات - أم أنني بحاجة حقًا إلى إنشاء واحدة جديدة؟أنا متأكد من عدم وجود الكثير من النفقات العامة ولكنني أفضل استخدام تلك الموجودة مسبقًا إذا استطعت.

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

المحلول

قبل طرح هذا السؤال، كنت قد ألقيت نظرة على بعض كود مصدر MVC، ولكن من الواضح أنني فاتني هذا، وهي الطريقة التي يتم بها القيام بذلك لمساعد الصورة.

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "1#", Justification = "The return value is not a regular URL since it may contain ~/ ASP.NET-specific characters")]
        public static string Image(this HtmlHelper helper, string imageRelativeUrl, string alt, IDictionary<string, object> htmlAttributes) {
            if (String.IsNullOrEmpty(imageRelativeUrl)) {
                throw new ArgumentException(MvcResources.Common_NullOrEmpty, "imageRelativeUrl");
            }

            UrlHelper url = new UrlHelper(helper.ViewContext);
            string imageUrl = url.Content(imageRelativeUrl);
            return Image(imageUrl, alt, htmlAttributes).ToString(TagRenderMode.SelfClosing);
        }

يبدو وكأنه إنشاء مثيل جديد UrlHelper هو النهج الصحيح بعد كل شيء.هذا جيد بشكل كافي لي.


تحديث: رمز RTM من كود مصدر ASP.NET MVC v1.0 يختلف قليلاً كما هو موضح في التعليقات.

ملف:MVC\src\MvcFutures\Mvc\ImageExtensions.cs

 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings", MessageId = "1#", Justification = "The return value is not a regular URL since it may contain ~/ ASP.NET-specific characters")]
        public static string Image(this HtmlHelper helper, string imageRelativeUrl, string alt, IDictionary<string, object> htmlAttributes) {
            if (String.IsNullOrEmpty(imageRelativeUrl)) {
                throw new ArgumentException(MvcResources.Common_NullOrEmpty, "imageRelativeUrl");
            }

            UrlHelper url = new UrlHelper(helper.ViewContext.RequestContext);
            string imageUrl = url.Content(imageRelativeUrl);
            return Image(imageUrl, alt, htmlAttributes).ToString(TagRenderMode.SelfClosing);
        }

نصائح أخرى

لقد واجهت مشكلة مماثلة وقررت أنه سيكون من الأسهل الاتصال بـ UrlHelper في العرض وتمرير الإخراج إلى ملحق HtmlHelper الخاص بي.في حالتك سيبدو الأمر كما يلي:

<%= Html.CreateDialogLink( "text", Url.Content( "~/...path.to.content" ) ) %>

إذا كنت تريد الوصول إلى أساليب الامتداد الموجودة على HtmlHelper الحالي الذي تم تمريره إلى الفصل الدراسي الخاص بك، فيجب عليك فقط استيراد System.Web.Mvc.Html في ملف التعليمات البرمجية المصدر الخاص بك وستتمكن من الوصول إليها (حيث توجد فئات الامتداد يتم تعريفها).إذا كنت تريد UrlHelper، فسوف تحتاج إلى إنشاء مثيل لأن HtmlHelper الذي تحصل عليه لا يحتوي على مؤشر لصفحة العرض التي تأتي منها.

إذا كنت بحاجة إلى إنشاء UrlHelper في فئة الأداة المساعدة، فيمكنك القيام بما يلي:

سلسلة عنوان url = "~/content/images/foo.jpg";

  var urlHelper = new UrlHelper(new RequestContext(
                  new HttpContextWrapper(HttpContext.Current), 
                  new RouteData()), RouteTable.Routes);

  string absoluteUrl = urlHelper.Content(url);

يتيح لك هذا استخدام التوجيه أو "التوسيع ~" بعيدًا عن سياق MVC.

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

يمكنك أيضًا تحديد هذه الطريقة في فئة مشتقة من MasterPage/ViewMasterPage ثم اشتقاق الصفحة من ذلك.بهذه الطريقة، يمكنك الوصول إلى جميع خصائص المثيل ولا يتعين عليك تمريرها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top