.NET এমভিসি 3 রেজার এডিটর সহ এইচটিএমএল 5 স্থানধারক বর্ধনের জন্য?


92

@ এইচটিএমএল ব্যবহার করে এইচটিএমএল 5 প্লেসহোল্ডার লেখার কোনও উপায় আছে?

@Html.TextBoxFor(model => model.Title, new { @placeholder = "Enter title here"})

অথবা এটা এই অর্থে যে হয়তো DataAnnotations মাধ্যমে 'বিবরণ' প্রদর্শন অ্যাট্রিবিউট (অনুরূপ ব্যবহার করতে পারেন আমাদের নিজস্ব এক্সটেনশন লিখতে হবে এই )?

অবশ্যই, তারপরে একই প্রশ্নটি 'অটোফোকাস' এর ক্ষেত্রেও প্রযোজ্য।

উত্তর:


68

কাস্টম লেখার জন্য আপনি নীচের নিবন্ধটি একবার দেখে নিতে পারেন DataAnnotationsModelMetadataProvider

এবং সদ্য প্রবর্তিত IMetadataAware ইন্টারফেস জড়িত এগিয়ে যাওয়ার আরও একটি এএসপি.নেট এমভিসি 3 উপায়' s

এই ইন্টারফেসটি প্রয়োগ করে একটি কাস্টম বৈশিষ্ট্য তৈরি করে শুরু করুন:

public class PlaceHolderAttribute : Attribute, IMetadataAware
{
    private readonly string _placeholder;
    public PlaceHolderAttribute(string placeholder)
    {
        _placeholder = placeholder;
    }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["placeholder"] = _placeholder;
    }
}

এবং তারপরে এটি আপনার মডেলটি সাজান:

public class MyViewModel
{
    [PlaceHolder("Enter title here")]
    public string Title { get; set; }
}

পরবর্তী একটি নিয়ামক সংজ্ঞায়িত:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }
}

একটি সম্পর্কিত মতামত:

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Title)
    <input type="submit" value="OK" />
}

এবং অবশেষে সম্পাদক টেম্পলেট ( ~/Views/Shared/EditorTemplates/string.cshtml):

@{
    var placeholder = string.Empty;
    if (ViewData.ModelMetadata.AdditionalValues.ContainsKey("placeholder"))
    {
        placeholder = ViewData.ModelMetadata.AdditionalValues["placeholder"] as string;
    }
}
<span>
    @Html.Label(ViewData.ModelMetadata.PropertyName)
    @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { placeholder = placeholder })
</span>

IMetadataAware ইন্টারফেসের তথ্য (এবং একটি দুর্দান্ত উদাহরণ) জন্য ধন্যবাদ!
21

4
এটি কি এখনও এমভিসি 3 এর জন্য বৈধ? আমি এমভিসি 3 তে একটি নতুন [ডিসপ্লে (প্রম্পট = "টাইপ ওয়াটারমার্ক")] লক্ষ্য করেছি তবে এটি কার্যকর করতে পারেনি। কোন ধারণা?
smnbss

4
@smnbss আপনি ঠিক আছেন কীভাবে Promptকাজ করবেন তা দেখতে আমার উত্তর দেখুন ।
ড্যানিয়েল লিয়ুজি

6
প্লেসোল্ডার করার জন্য বাহ এত কাজ? কিছু সহজ হতে হবে: এস
ক্রিলোভিচ

উত্তরগুলি নম্রভাবে দেখুন কিছু আছে। প্যাক্স একটি ভাল আছে।
টার্মটো

121

দারিন দিমিত্রভের উত্তরে স্ম্নবিএস মন্তব্য হিসাবে Promptঠিক এই উদ্দেশ্যে উপস্থিত রয়েছে, তাই কাস্টম বৈশিষ্ট্য তৈরি করার দরকার নেই । ডকুমেন্টেশন থেকে:

পাওয়া যায় বা একটি মান সেট করে যা ইউআইতে প্রম্পটের জন্য ওয়াটারমার্ক সেট করতে ব্যবহৃত হবে।

এটি ব্যবহারের জন্য, কেবল আপনার মতামতের মডেলটির সম্পত্তিটি সাজান:

[Display(Prompt = "numbers only")]
public int Age { get; set; }

এই পাঠ্যটি তখন সুবিধার্থে স্থাপন করা হয়েছে ModelMetadata.Watermark। বাক্সের বাইরে, এমভিসি 3 এ ডিফল্ট টেম্পলেটটি Watermarkসম্পত্তিটিকে উপেক্ষা করে , তবে এটিকে কাজ করা সত্যিই সহজ। এমভিসি কীভাবে এটি রেন্ডার করতে হয় তা বলার জন্য আপনাকে কেবল ডিফল্ট স্ট্রিং টেম্পলেটটি টুইট করতে হবে। ডারিনের মতো স্ট্রিং.সি.এস.টি.এম.এল সম্পাদনা করুন, ওয়াটারমার্কটি প্রাপ্ত করার পরিবর্তে ModelMetadata.AdditionalValuesআপনি এটিকে সরাসরি পান ModelMetadata.Watermark:

Views / ভিউ / ভাগ করা / সম্পাদকআপনিপ্লেটগুলি / স্ট্রিং.একএসটিএমএল:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = "text-box single-line", placeholder = ViewData.ModelMetadata.Watermark })

এবং এটি হয়।

আপনি দেখতে পাচ্ছেন যে, সমস্ত কিছু কাজ করার মূল চাবিকাঠিটি placeholder = ViewData.ModelMetadata.Watermarkকিছুটা।

আপনি যদি মাল্টি-লাইন পাঠ্যবাক্সগুলির জন্য (টেক্সারিয়াস) ওয়াটারমার্কিং সক্ষম করতে চান তবে আপনি মাল্টিলাইনটেক্সট.সিএসটিএমএল এর জন্যও তাই করুন:

Views / ভিউ / ভাগ করা / সম্পাদকTemplets / MultilineText.cshtml:

@Html.TextArea("", ViewData.TemplateInfo.FormattedModelValue.ToString(), 0, 0, new { @class = "text-box multi-line", placeholder = ViewData.ModelMetadata.Watermark })

6
@ ব্র্যাট আসলেই আছে। এডিটরফোর্ড () এমভিসি ২-তে প্রবর্তিত একটি টেম্পলেটড সহায়ক first আমার উত্তরটি এমভিসিটিকে "শেখানোর" বৈশিষ্ট্যের সাথে এই বৈশিষ্ট্যের উপর ভিত্তি করে Promptগুণাবলীর সাথে কী করতে হবে । এই টেমপ্লেটগুলি সম্পর্কে আরও তথ্যের জন্য, আপনি ব্র্যাড উইলসনের এই দুর্দান্ত পোস্টটি উল্লেখ করতে পারেন: bradwilson.typepad.com/blog/2009/10/…
ড্যানিয়েল লিউজি

4
@ ডটনেটওয়াইজ আমি নিশ্চিত না আপনি কেন এমনটি বললেন? DisplayAttribute(প্রম্পট সহ) এর সমস্ত স্ট্রিং প্যারামিটার স্থানীয়করণযোগ্য। আপনি শুধু আপনার টীকা মধ্যে ResourceType উল্লেখ করা প্রয়োজন: [Display(ResourceType = typeof(PeopleResources), Prompt = "AgePrompt")]। এবং এটাই. জলছাপ টেক্সট এখন কী থেকে আসে AgeGroup রিসোর্স PeopleResources
ড্যানিয়েল লিউজি

4
আপনি যদি .resx সংস্থানগুলি ব্যবহার করছেন না তবে i18N .po স্থানীয়করণ সিস্টেম ব্যবহার করছেন?
অ্যাডাপ্টাবী

4
@ ফ্রেঞ্চিসরোজার্স EditorTemplatesফোল্ডারটি ডিফল্টরূপে নেই; আপনি কেবল আপনার Views\Sharedফোল্ডারে তৈরি করেছেন (বা Views\{ControllerName}আপনি যদি এটি কোনও নির্দিষ্ট নিয়ামকের সাথে সুনির্দিষ্ট করতে চান)। তারপরে আপনি এই ফোল্ডারের ভিতরে আপনার .cshtml টেম্পলেটগুলি রাখুন এবং আপনার যাওয়া ভাল।
ড্যানিয়েল লিউজি

4
@ রবার্টআইভ্যাঙ্ক আমি উত্তরটি সম্পাদনা করেছি এবং র্যালি বাকনার দ্বারা সম্পাদিত সম্পাদনাটি উল্টে দিয়েছি যা আপনার এবং টেডের দ্বারা প্রদত্ত সমস্যার কারণ হয়ে দাঁড়ায়। ধন্যবাদ
ড্যানিয়েল লিউজি

22

আমি আসলে বেশিরভাগ সময় স্থানধারীর পাঠ্যের জন্য প্রদর্শনের নামটি ব্যবহার করতে পছন্দ করি। এখানে ডিসপ্লে নাম ব্যবহার করার উদাহরণ রয়েছে:

  @Html.TextBoxFor(x => x.FirstName, true, null, new { @class = "form-control", placeholder = Html.DisplayNameFor(x => x.FirstName) })

4
ওয়াটারমার্কের জন্য একটি বিশেষ ডেটা টীকা প্রম্পট রয়েছে। এবং প্রদর্শনের নামটি ফিল্ড লেবেলের জন্য। এগুলি মিশ্রিত করা খারাপ ধারণা। সঠিক কাজের জন্য সঠিক জিনিস ব্যবহার করুন। আমার উত্তর দেখুন।
মাইক এশভা

4
ধন্যবাদ, এটাই আমি খুঁজছিলাম, সহজ এবং বিন্দুটি যখন আমরা প্রদর্শনের নাম পেতে পারি তখন কেন আরও ক্লাস যুক্ত করা যায়
সাকিবাহমাদ

এটি ডিসপ্লেনামের সরবরাহিত পাঠ্যটিকে ডাবল-এড়িয়ে চলবে - ফরাসী ভাষায় উচ্চারণ সহ উদাহরণস্বরূপ ভাষার জন্য ভাল সমাধান নয়।
মারাপেট

3

আমি একটি সাধারণ ক্লাস লিখেছি:

public static class WatermarkExtension
{
    public static MvcHtmlString WatermarkFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        var watermark = ModelMetadata.FromLambdaExpression(expression, html.ViewData).Watermark;
        var htmlEncoded = HttpUtility.HtmlEncode(watermark);
        return new MvcHtmlString(htmlEncoded);
    }
}

যেমন ব্যবহার:

@Html.TextBoxFor(model => model.AddressSuffix, new {placeholder = Html.WatermarkFor(model => model.AddressSuffix)})

এবং একটি ভিউ মডেলে সম্পত্তি:

[Display(ResourceType = typeof (Resources), Name = "AddressSuffixLabel", Prompt = "AddressSuffixPlaceholder")]
public string AddressSuffix
{
    get { return _album.AddressSuffix; }
    set { _album.AddressSuffix = value; }
}

প্রম্পট পরামিতি লক্ষ্য করুন। এই ক্ষেত্রে আমি স্থানীয়করণের জন্য সংস্থান থেকে স্ট্রিং ব্যবহার করি তবে আপনি কেবল স্ট্রিং ব্যবহার করতে পারেন, কেবল রিসোর্সটাইপ পরামিতি এড়াতে পারেন।


স্রেফ ডিসপ্লেডনামফোর্ড পদ্ধতিটি বাতিল করে ওয়াটারমার্কের জন্য একটি অ্যানালগ তৈরি করে।
মাইক এশভা

হাই, আপনি যদি দয়া করে ডিসপ্লে -> প্রম্পট মান নির্দিষ্ট না করে থাকেন তবে ডিসপ্লে-নাম বৈশিষ্ট্য মানটি ব্যবহার করতে আপনার MvcHtML স্ট্রিং ওয়াটারমার্কের জন্য () আপনার পদ্ধতিটি পরিবর্তন করতে পারেন?
সাসা তানসভ

আপনি কোথায় আপনার ওয়াটারমার্ক এক্সটেনশন ক্লাসটি সংরক্ষণ করবেন যাতে এটি আপনার বর্ণনার পরে ব্যবহার করা যায়? এইচটিএমএল.ওয়াটারমার্কফোর্ড (মডেল => মডেল.এড্রেসসফিক্স)
ক্রেগ জেরদিনডেন

3

আমি রিসোর্স ফাইলের সাথে এইভাবে ব্যবহার করি (আর প্রম্পটের দরকার নেই!)

@Html.TextBoxFor(m => m.Name, new 
{
     @class = "form-control",
     placeholder = @Html.DisplayName(@Resource.PleaseTypeName),
     autofocus = "autofocus",
     required = "required"
})

1

উপরের ধারণাগুলি ব্যবহার করে আমি তৈরি একটি সমাধান এখানে পাঠ্যবক্সফোর্ড এবং পাসওয়ার্ডফোর্ডের জন্য ব্যবহার করা যেতে পারে:

public static class HtmlHelperEx
{
    public static MvcHtmlString TextBoxWithPlaceholderFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        return htmlHelper.TextBoxFor(expression, htmlAttributes.AddAttribute("placeholder", metadata.Watermark));

    }

    public static MvcHtmlString PasswordWithPlaceholderFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        return htmlHelper.PasswordFor(expression, htmlAttributes.AddAttribute("placeholder", metadata.Watermark));

    }
}

public static class HtmlAttributesHelper
{
    public static IDictionary<string, object> AddAttribute(this object htmlAttributes, string name, object value)
    {
        var dictionary = htmlAttributes == null ? new Dictionary<string, object>() : htmlAttributes.ToDictionary();
        if (!String.IsNullOrWhiteSpace(name) && value != null && !String.IsNullOrWhiteSpace(value.ToString()))
            dictionary.Add(name, value);
        return dictionary;
    }

    public static IDictionary<string, object> ToDictionary(this object obj)
    {
        return TypeDescriptor.GetProperties(obj)
            .Cast<PropertyDescriptor>()
            .ToDictionary(property => property.Name, property => property.GetValue(obj));
    }
}

0

আমি মনে করি একটি কাস্টম এডিটর টেম্প্লেট তৈরি করা ভাল সমাধান নয়, কারণ বিভিন্ন ক্ষেত্রে আপনার অনেকগুলি সম্ভাব্য টেপমলেটগুলির যত্ন নেওয়া দরকার: স্ট্রিং, নামজার্স, কম্বোবক্স এবং আরও অনেক কিছু। অন্যান্য সমাধান হ'ল এইচটিএমএলহেল্পারের কাস্টম এক্সটেনশন।

মডেল:

public class MyViewModel
{
    [PlaceHolder("Enter title here")]
    public string Title { get; set; }
}

এইচটিএমএল সহায়ক সম্প্রসারণ:

   public static MvcHtmlString BsEditorFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TValue>> expression, string htmlClass = "")
{
    var modelMetadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    var metadata = modelMetadata;

    var viewData = new
    {
        HtmlAttributes = new
            {
                @class = htmlClass,
                placeholder = metadata.Watermark,
            }
    };
    return htmlHelper.EditorFor(expression, viewData);

}

একটি সম্পর্কিত মতামত:

@Html.BsEditorFor(x => x.Title)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.