রেজার দিয়ে জেনেরিক @ হেল্পার পদ্ধতি তৈরি করা সম্ভব?


90

আমি রেজারে এমন কোনও সহায়ক লেখার চেষ্টা করছি যা নিম্নলিখিতগুলির মতো দেখাচ্ছে:

@helper DoSomething<T, U>(Expression<Func<T, U>> expr) where T : class

দুর্ভাগ্যক্রমে, পার্সার মনে করে যে <Tএটি কোনও এইচটিএমএল উপাদানটির শুরু এবং আমি একটি সিনট্যাক্স ত্রুটির সাথে শেষ করি। জেনারিক পদ্ধতিতে রেজারের সাহায্যে কোনও সহায়ক তৈরি করা কি সম্ভব? যদি তাই হয়, সিনট্যাক্স কি?


এখনও বর্তমান এমভিসি 4 রিলিজে স্থির হয়নি। :(
অ্যালেক্স ড্রেসকো

4
এটি কীভাবে এখনও ভিএস ২০১২-এ স্থির নয়?
অ্যালেক্স ড্রেস্কো

7
মঙ্গল, আমি এটি যুক্ত হওয়ার অপেক্ষা করতে পারি না; আমি আশা করি এটি অগ্রাধিকার তালিকার " গতকাল এটি প্রয়োগ করুন " এর কাছাকাছি কোথাও রয়েছে । আংশিকভাবে অফ-টপিক, তবে এর পাশাপাশি, আমি দেখতে চাই যে উত্পন্ন শ্রেণিগুলি static, যদি না বাস্তবায়নের বিশদ এটি নিষিদ্ধ করে; কারণ হ'ল, কেউ জেনেরিক এক্সটেনশন@helper Foo<T>(this T o) where T : IBar { }
সহায়কগুলি

উত্তর:


52

না, এটি বর্তমানে সম্ভব নয়। পরিবর্তে আপনি একটি সাধারণ এইচটিএমএল সহায়ক লিখতে পারেন।

public static MvcHtmlString DoSomething<T, U>(
    this HtmlHelper htmlHelper, 
    Expression<Func<T, U>> expr
) where T : class
{
    ...
}

এবং তারপর:

@(Html.DoSomething<SomeModel, string>(x => x.SomeProperty))

বা যদি আপনি মডেলটিকে প্রথম জেনেরিক যুক্তি হিসাবে লক্ষ্য করে থাকেন:

public static MvcHtmlString DoSomething<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expr
) where TModel : class
{
    ...
}

যা আপনাকে এটির মতো অনুরোধ করার অনুমতি দেবে (অবশ্যই ধরে নেওয়া যায় যে আপনার দৃষ্টিভঙ্গি দৃ strongly়ভাবে টাইপ করা হয়েছে, তবে এটি একটি নিরাপদ অনুমান) কারণ সমস্ত মতামত যেকোনভাবে দৃ)়ভাবে টাইপ করা উচিত :-)):

@Html.DoSomething(x => x.SomeProperty)

10
আশা করা যায় এটি তারা রেজর সহায়কদের ভবিষ্যতের সংস্করণে যুক্ত করবে। Heতিহ্যবাহী সহায়তার পাঠযোগ্যতা @ হেল্পার সিনট্যাক্সের চেয়ে অনেক কম।
মেকডববস

4
হ্যাঁ রাজি। পুরানো পদ্ধতিতে ফিরে যাওয়া কেবল চুষে দেয় না, তবে আপনার সহায়তাকারীদের বিচ্ছিন্নভাবে আলাদা করে দেয়!
জর্জ আর

127

এই হল সহায় আছেন ফাইল ভিতরে অর্জন করা সম্ভব @functionsসিনট্যাক্স কিন্তু আপনি যদি চান ক্ষুর-শৈলী পাঠযোগ্যতা আপনি আপনি উল্লেখ করা হয় এছাড়াও এইচটিএমএল হইয়া এবং ফিনিস করতে একটি নিয়মিত সাহায্যকারী কল করতে হবে।

মনে রাখবেন যে কোনও হেল্পার ফাইলে ফাংশনগুলি স্থিতিশীল তাই আপনি যদি এখনও এর পদ্ধতিগুলি ব্যবহার করতে চান তবে পৃষ্ঠা থেকে এইচটিএমএল হেল্পার উদাহরণটি আপনাকে পাস করতে হবে।

উদাহরণস্বরূপ দর্শনগুলি \ MyView.cshtml:

@MyHelper.DoSomething(Html, m=>m.Property1)
@MyHelper.DoSomething(Html, m=>m.Property2)
@MyHelper.DoSomething(Html, m=>m.Property3)

অ্যাপ_কোড \ MyHelper.cshtml:

@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@using System.Linq.Expressions;
@functions
{
    public static HelperResult DoSomething<TModel, TItem>(HtmlHelper<TModel> html, Expression<Func<TModel, TItem>> expr)
    {
        return TheThingToDo(html.LabelFor(expr), html.EditorFor(expr), html.ValidationMessageFor(expr));
    }
}
@helper TheThingToDo(MvcHtmlString label, MvcHtmlString textbox, MvcHtmlString validationMessage)
{
    <p>
        @label
        <br />
        @textbox
        @validationMessage
    </p>
}
...

এটি নিখুঁত। ধন্যবাদ
কেন স্মিথ

আপনাকে পদ্ধতিটি স্থিতিশীল করতে হবে না এবং এইভাবে আপনাকে আপনার এইচটিএমএল / ইউআরএল / মডেল ইত্যাদি পাশ করার দরকার নেই
শেপি

12
@ শিপি, এটি ঠিক অর্ধেক সত্য। আপনি সঠিক, আপনি এগুলি অ-স্থিতিশীল করতে পারেন, তবে আপনি কেবল System.Web.WebPages.Html.HtmlHelperএটির পরিবর্তে পান System.Web.Mvc.HtmlHelperWebPagesবেশিরভাগ এক্সটেনশন পদ্ধতির বিপরীতে লেখা কারণ সংস্করণটি আপনার পক্ষে উপযুক্ত না হওয়ার একটি দুর্দান্ত সুযোগ রয়েছে System.Web.Mvc.HtmlHelper। তদুপরি, এখানে কোনও Urlসম্পত্তি নেই এবং UrlHelperএটির RequestContextজন্য WebPagesসংস্করণটি উপলভ্য নয় requires সব মিলিয়ে আপনি সম্ভবত পাস করতে হবে Mvc HtmlHelper
কির্ক ওল

4
সহায়কটি অবশ্যই অ্যাপ_ কোড ফোল্ডারের অংশ হতে পারে ??
বিশাল শর্মা

4
হ্যাঁ, এই ফাইলটি অবশ্যই {MyMvcProject}\App_Code`. It doesn't work as advertised when you place it elsewhere. The error *Cannot access non-static method 'TheThingToDo' in static context* disappears when you move MyHelper.cshtml` এ beোকাতে হবে App_CodeDoSomethingস্থির হওয়া উচিত, যাতে @MyHelper.DoSomething(..)আপনি আপনার দৃষ্টিতে কল করতে পারেন । আপনি যদি এটি অ-স্থিতিশীল করেন তবে আপনাকে MyHelperপ্রথমে একটি উদাহরণ তৈরি করতে হবে ।
গ্রিলস

3

সমস্ত ক্ষেত্রে উইলটি TModelএকই হবে (দর্শনটির জন্য ঘোষিত মডেল) এবং আমার ক্ষেত্রে TValueবিষয়টি একই হতে চলেছে, তাই আমি এক্সপ্রেশন যুক্তি প্রকারটি ঘোষণা করতে সক্ষম হয়েছি:

@helper FormRow(Expression<Func<MyViewModel, MyClass>> expression) {
  <div class="form-group">
    @(Html.LabelFor(expression, new { @class = "control-label col-sm-6 text-right" }))
    <div class="col-sm-6">
      @Html.EnumDropDownListFor(expression, new { @class = "form-control" })
    </div>
    @Html.ValidationMessageFor(expression)
  </div>
}

যদি আপনার মডেল ক্ষেত্রগুলি সমস্ত হয় stringতবে আপনি এটির MyClassসাথে প্রতিস্থাপন করতে পারেন string

সংজ্ঞায়িত সহ দুটি বা তিন জন সহায়ককে সংজ্ঞায়িত করা খারাপ নাও হতে পারে TValue, তবে আপনার কাছে যদি আরও কিছু আছে যা কিছু কুৎসিত কোড তৈরি করে, আমি সত্যিই ভাল সমাধান খুঁজে পাইনি। আমি ব্লকের @helperভিতরে রাখা একটি ক্রিয়াকলাপটি থেকে মুড়িয়ে ফেলার চেষ্টা করেছি @functions {}, তবে কখনও সে পথে কাজ করতে পেলাম না।


আপনি যখন এটি সম্পর্কে চিন্তা করেন তখন স্পষ্টরূপে - এটি যদি TModelআপনি সম্ভবত এটি আগেই জানতেন।
ta.speot.is

0

যদি আপনার প্রধান সমস্যা পেতে হয় নাম ল্যামডা অভিব্যক্তি ব্যবহার বাঁধাই জন্য গুণাবলীর মান মত মনে হয় @Html.TextBoxFor(x => x.MyPoperty), এবং আপনার কম্পোনেন্ট খুব জটিল এইচটিএমএল ট্যাগ হচ্ছে এবং ক্ষুর সাহায্যকারী উপর প্রয়োগ করা উচিত, তাহলে কেন শুধু একটি এক্সটেনশন পদ্ধতি তৈরি করবেন না HtmlHelper<TModel>সমাধান করতে বাঁধাই নাম:

namespace System.Web.Mvc
{
    public static class MyHelpers
    {
        public static string GetNameForBinding<TModel, TProperty>
           (this HtmlHelper<TModel> model, 
            Expression<Func<TModel, TProperty>> property)
        {
            return ExpressionHelper.GetExpressionText(property);
        }
    }
}

আপনার রেজার সহায়কটি যথারীতি হওয়া উচিত:

@helper MyComponent(string name)
{
    <input name="@name" type="text"/>
}

তাহলে এখানে আপনি এটি ব্যবহার করতে পারেন

@TheHelper.MyComponent(Html.GetNameForBinding(x => x.MyProperty))

এটি কি এইচটিএমএলটিএম.আইডফোর্ড (...) এর জন্য নয়?
অ্যালেক্স ড্রেসকো

হ্যাঁ, আপনি এটি করতে পারেন @Htm.IdForতবে স্ট্রিংয়ে রূপান্তর করতে অতিরিক্ত প্রক্রিয়া প্রয়োজন ( .ToHtmlString()) যেখানে
সহায়কটির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.