রেজারের ঘোষণামূলক দর্শনগুলি থেকে এমভিসি এইচটিএমএল হেল্পার এক্সটেনশনগুলি ব্যবহার করা


121

আমি একটি এমভিসি 3 আরটিএম প্রকল্পের জন্য আমার অ্যাপ_কোড ফোল্ডারে একটি রেজার ডিক্লেটিভ হেল্পার তৈরি করার চেষ্টা করছিলাম।

আমার যে সমস্যাটি দেখা গেল তা হ'ল এমভিসি এইচটিএমএল হেল্পার এক্সটেনশানগুলি, যেমন অ্যাকশনলিঙ্ক, উপলব্ধ নেই। এর কারণ কম্পাইল সাহায্যকারী থেকে আহরণ করা System.Web.WebPages.HelperPage, এবং এটি একটি অনাবৃত যদিও Htmlসম্পত্তি টাইপ তার System.Web.WebPages.HtmlHelperবদলে System.Web.Mvc.HtmlHelper

আমি যে ধরণের ত্রুটি পাচ্ছিলাম তার একটি উদাহরণ:

'System.Web.Mvc.HtmlHelper' তে 'অ্যাকশন লিঙ্ক' এর সংজ্ঞা নেই এবং কোনও এক্সটেনশন পদ্ধতি নেই 'অ্যাকশনলিঙ্ক' টাইপের প্রথম আর্গুমেন্ট গ্রহণ করে 'System.Web.Mvc.HtmlHelper' পাওয়া যায় (আপনি কি কোনও নির্দেশিকা ব্যবহার করে নিখোঁজ রয়েছেন? বা একটি সমাবেশ রেফারেন্স?)

আমার একমাত্র সমাধান হ'ল আমার নিজস্ব হেল্পারপেজ তৈরি করা এবং এইচটিএমএল সম্পত্তি ওভাররাইড করা:

using System.Web.WebPages;

public class HelperPage : System.Web.WebPages.HelperPage 
{
    // Workaround - exposes the MVC HtmlHelper instead of the normal helper
    public static new HtmlHelper Html
    {
        get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; }
    }
}

তারপরে আমাকে প্রতিটি সহায়িকার শীর্ষে নীচে লিখতে হবে:

@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html

@helper DoSomething()
{
    @Html.ActionLink("Index", "Home")
}

এটি কি এমভিসি 3 এ শক্ত হওয়ার অর্থ, বা আমি কিছু ভুল করছি?


4
যদি আপনারও ইউআরএল সহায়ক দরকার হয় তবে আপনি কোডার এই লাইনটি হেল্পারপেজে যুক্ত করুন: পাবলিক স্ট্যাটিক ইউরেলহেল্পার ইউআর {নতুন el হেল্পারকে ফেরত দিন {পান H পান; ফিরে আসুন (এইচটিএমএল.ভিউকনেক্সটেক্সট.রেকুয়েস্টকন্টেক্সট); }}
মার্কো স্টাফোলি

উত্তর:


42

এই প্রশ্নের Marcindউত্তর একবার দেখুন । আপনি যা অনুভব করছেন তা হ'ল App_Codeফোল্ডারে ঘোষণাপত্র প্রদর্শন করার একটি সীমাবদ্ধতা ।

আপনার সাহায্যকারীদের অ্যাপ_কোডে রাখার কাজ করে তবে কিছু নির্দিষ্ট সীমাবদ্ধতা রয়েছে যা নির্দিষ্ট এমভিসি পরিস্থিতিগুলিকে প্রভাবিত করে (উদাহরণস্বরূপ: স্ট্যান্ডার্ড এমভিসি এইচটিএমএল অ্যাক্সেস নেই help


1
অন্যান্য পাঠকদের জন্য দ্রষ্টব্য: এই উত্তরটি একেবারে সঠিক, তবে সম্ভাব্য কাজের জন্য নীচে অ্যান্ড্রু নার্সের অতিরিক্ত অবদানও পরীক্ষা করে দেখুন check
জর্ডান গ্রে

38

আমি ওয়েব পৃষ্ঠাগুলি সহায়তার জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করেছি যাতে আমি পৃষ্ঠা সহায়কটির অ্যাক্সেস পেতে পারি।

public static HtmlHelper GetPageHelper(this System.Web.WebPages.Html.HtmlHelper html)
{
 return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html;
}

4
ব্যবহার:@Html.GetPageHelper().ActionLink("actioname")
ডেরচাও

আমার জন্য এই কাজ করে, কিন্তু আমি যোগ করতে ছিল @using System.Web.Mvcএবং @using System.Web.Mvc.Htmlভিতরে App_Code cshtml সাহায্যকারী ফাইলে
Tomino

1
আলাদা আলাদা এইচটিএমএলহেল্পার ক্লাস কেন আছে? এটি অ্যাপ_কোডে বা ভিউগুলিতে হোক না কেন একই হওয়া উচিত। এপিক অর্ধ-বাস্তবায়িত ডিজাইন ব্যর্থ।
ট্রায়ঙ্কো

এখানে ওয়েবলগস.এএসপি.এন. / এসকটগু / রেফারেন্স পেয়েছেন যা "গ্লোবাল" রেজার হেল্পারদের কীভাবে তৈরি করবেন তা বর্ণনা করে একটি ভাল কাজ করে। আমি তখন, আপনি যদি শুধুমাত্র প্রয়োজন HtmlHelperউদ্দেশ্যে এনকোডিং করার জন্য বর্গ, আমি একটি এমনকি দ্রুততর উপায় এই কাজ করতে স্ট্যাটিক বর্গ মারফত পাওয়া Microsoft.Security.Application.Encoderহিসেবে:Encoder.HtmlAttributeEncode(value)
ম্যাট Borja,

11

ওমর এখানে সঠিক উত্তর পেয়েছেন, তবে আমি কিছু যুক্ত করতে চেয়েছিলাম (ওমরের প্রতিক্রিয়াটিকে উত্তর হিসাবে চিহ্নিত করে নির্দ্বিধায়)

আমরা ভি 1-তে এটি সম্পর্কে অবগত ছিলাম এবং পণ্যটিতে দুর্দান্ত ফিক্স পেতে সক্ষম হচ্ছিলাম না, তবে ডেভিড এবো (এএসপি. নেট দলটির একজন স্থপতি) একটি ভিজ্যুয়াল স্টুডিও কোড জেনারেটরের একটি নমুনা পোস্ট করেছিলেন যা মূলত প্রথম অনুসন্ধানে এই কাজটি সঠিকভাবে করার জন্য আমরা যে ধরণের ধারণাগুলি খুঁজছি: http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries .aspx

এটি চেষ্টা করে দেখুন এবং আপনি কী ভাবেন! ডেভিডকে তার ব্লগে পোস্ট করে মন্তব্য থাকলে তা জানান।


2
রেজারের পরবর্তী সংস্করণে এটি ঠিক করার পরিকল্পনা রয়েছে? আমি লক্ষ্য করেছি যে এটি এখনও ভিএস 11 বিটাতে একটি সমস্যা।
ওমর

9

@ জ্যাকস এর উত্তরের মতো:

public static class MvcIntrinsics {
    public static System.Web.Mvc.HtmlHelper Html {
        get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html; }
    }

    public static System.Web.Mvc.AjaxHelper Ajax {
        get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Ajax; }
    }

    public static System.Web.Mvc.UrlHelper Url {
        get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Url; }
    }

}

ব্যবহার:

@MvcIntrinsics.Html.Raw("test")

উত্স: ডাইনো এস্পোসিতো - প্রোগ্রামিং মাইক্রোসফ্ট এএসপি.নেট এমভিসি


1
এটি হাস্যকর যে এটি এমনকি প্রয়োজনীয় এবং অ্যাপ_কোডে দেখার জন্য এগুলি কেবল বেস শ্রেণীর অংশ নয়।
ট্রায়ঙ্কো

7

একটি বিকল্প সমাধান:

এটি আপনার রেজার-সহায়তাকারী ফাইলের শীর্ষে যুক্ত করুন:

@functions {
    public static System.Web.Mvc.HtmlHelper<object> HHtml = ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html;
}

তারপরে এটিকে কল করুন:

@HHtml.ActionLink("actionname")

এটি দেখে মনে হয়েছিল এটি আমার পক্ষে প্রাথমিকভাবে কাজ করেছে তবে সাহায্যকারীকে আবার কল করার সময় আমি পেয়েছি 'মান প্রত্যাশিত সীমার মধ্যে পড়ে না'।
d219

3

এটির জন্য আমার অভিমতটি হ'ল সহায়ক পদ্ধতির পরামিতি হিসাবে পৃষ্ঠাটি সহজভাবে পাস করা। সুতরাং আপনার উদাহরণে এটি হবে:

@helper DoSomething(WebViewPage page)
{
    @page.Html.ActionLink("Index", "Home")
}

তারপরে আপনার রেজার ভিউতে যেখানে এটি প্রয়োজন সেখানে এটিকে এটি কল করুন:

@YourHelperFilename.DoSomething(this)

এটি করলে অবিলম্বে আপনার মত পৃষ্ঠা বৈশিষ্ট্য অ্যাক্সেস দেয় Htmlবা Urlআপনি সাধারণত যে আছে (এবং মাধ্যমেHtmlHelper এক্সটেনশন)।

অতিরিক্ত সুবিধা হিসাবে (যদি আপনার এটির প্রয়োজন হয়), আপনি পৃষ্ঠার মতো উদাহরণ বৈশিষ্ট্যগুলিতেও অ্যাক্সেস পেতে পারেন ViewData


3

সন্ধানকারীদের সুবিধার জন্য, ক্লাস লাইব্রেরির অংশ হিসাবে এমভিসি ভিউগুলি তৈরি করার সময় আমি একই ত্রুটি পেয়েছি (উপাদান পুনরায় ব্যবহারের জন্য)। আংশিকভাবে উপরে বর্ণিত সমাধানটি হ'ল .cshtml ফাইলের শীর্ষে নীচের বিবৃতি ব্যবহার করে যুক্ত করা:

@using System.Web.Mvc
@using System.Web.Mvc.Html

আর কোনও কাজের দরকার নেই।


App_Code এর অধীনে আমার .cshtml এ আমার সহায়করা ইনটেলিসেন্সে স্বীকৃত ছিল না। App_code এর অধীনে আমার .cshtml এর শীর্ষে @ ব্যবহার করা সিস্টেম.ওয়েব.এমভিসি.এইচটিএমএল যুক্ত করা।

আমি যখন এটি করি, "Could not load type 'System.Web.WebPages.Instrumentation.InstrumentationService' from assembly 'System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."ঘুরে বেড়ানোর সময় আমি পাই @using System.Web.Mvc। কোন ধারনা?
জোব্রোকহাউস

এটি আমার জন্য কোনও পার্থক্য করে না
মেমস

0

আমি জানি যে এমভিসি 3 এর সাথে কিছু ইন্টিলিজেন্স সমস্যা আছে I

এমভিসি 3 আরটিএম সবে পুনরায় খুশি হয়েছে আপনি কি এটি বা বিটা ব্যবহার করছেন?


0

দেখে মনে হচ্ছে এএসপি.এনইটি এমভিসি ভিসি 2013 এ এই সমস্যাটি স্থির করেছে this এই পোস্টটি দেখুন: htmlhelper-HT


না। কখনোই না. ইন্টেলিজেন্স এক্সটেনশন পদ্ধতিগুলি তুলছে না, এবং আমার ভিএস ২০১৩ আপডেট রয়েছে 5.. আমার কাছে @using System.Web.Mvc.Htmlঅ্যাপ_কোডে সিএসটিএমএল ফাইলের শীর্ষে রয়েছে, তবে @ এইচটিএমএল লেখা .... যেমন কোনও এক্সটেনশন পদ্ধতি প্রকাশ করে না EditorFor। এটি অত্যন্ত গুরুত্বপূর্ণ যে এটি প্রয়োগ করা হয়েছে দাবি করে 2 টি বড় প্রকাশ এবং ব্লগ পোস্টের পরেও এটি কাজ করছে না। এটা না। প্রকৃতপক্ষে, এক্সটেনশন পদ্ধতিগুলি কাজ করতে পারে না, কারণ তারা System.Web.Mvc.Html সাহায্যকারী শ্রেণিকে লক্ষ্য করে, না System.Web.WebPages.Html সহায়তা বিভাগ, যা System.Web.WebPages.HelperPage বর্গ দ্বারা প্রকাশিত হয়।
ট্রাইঙ্কো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.