এএসপি.নেট এমভিসিতে এডিটরফোর্ড () এর জন্য এইচটিএমএল বৈশিষ্ট্য


129

আমি এইচটিএমএল বৈশিষ্ট্যগুলিতে কেন পাস করতে পারি না EditorFor()? যেমন;

<%= Html.EditorFor(model => model.Control.PeriodType, 
    new { disabled = "disabled", readonly = "readonly" }) %>

আমি মেটাটাটা ব্যবহার করতে চাই না

আপডেট : সমাধানটি ভিউ থেকে এটি কল করা ছিল:

 <%=Html.EditorFor( model => model.Control.PeriodEndDate, new {Modifiable=model.Control.PeriodEndDateModifiable})%>

এবং ViewData["Modifiable"]আমার কাস্টম এডিটর টেম্পলেটগুলি / স্ট্রিং.অ্যাসেক্সে ব্যবহার করুন যেখানে আমার কিছু দৃশ্যের যুক্তি রয়েছে যা নির্ধারণ করে যে ইনপুটটিতে কেবলমাত্র পাঠযোগ্য এবং / অথবা অক্ষম বৈশিষ্ট্য যুক্ত করতে হবে বা অজ্ঞাতনামা বস্তুকে EditorFor()একটি প্যারামিটার বলা হয় additionalViewDataএবং এর বৈশিষ্ট্যগুলি সম্পাদক টেমপ্লেটে প্রেরণ করা হয় ViewDataসংগ্রহ।


19
গুরুতরভাবে, এখনও এমভিসি 3 এ এই সীমাবদ্ধতার কোনও ধারণা নেই এবং এটি সত্যিই বিরক্তিকর। বিশ্বব্যাপী লোকেরা সময় কাটাচ্ছে এবং এই আজেবাজে চুল কাটাচ্ছে। আমি এটি মাইক্রোসফ্ট কানেক্টে প্রেরণ করছি।
জুনিয়র মেহে


3
এটি কি শুধু আমি, বা এটি খুব সরল সরল হওয়া উচিত এমন কোনও বিএস এর মতো মনে হচ্ছে?
এরিক কে

হয়তো এই আপনাকে সাহায্য করবে: [এবং CSS শ্রেণীর সঙ্গে EditorFor-বাস্তবায়ন এইচটিএমএল বৈশিষ্ট্যাবলী] [1] [1]: stackoverflow.com/questions/12675708/...
FunThom

উত্তর:


96

EditorForমেটাডেটা নিয়ে কাজ করে, তাই আপনি যদি এইচটিএমএল বৈশিষ্ট্য যুক্ত করতে চান তবে আপনি সর্বদা এটি করতে পারেন । অন্য বিকল্পটি হ'ল কেবল একটি কাস্টম টেম্পলেট লিখুন এবং ব্যবহার করুন TextBoxFor:

<%= Html.TextBoxFor(model => model.Control.PeriodType, 
    new { disabled = "disabled", @readonly = "readonly" }) %>    

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

কী PeriodType? এটি কি সাধারণ সম্পত্তি নয়? যদি এটি একটি জটিল অবজেক্ট হয় তবে আপনি সম্পত্তির প্রকারের নামটি ~/Views/ControllerName/EditorTemplates/SomeType.ascxকোথায় আংশিক রেখে পুরো টেম্পলেটটি কাস্টমাইজ করতে পারবেন । SomeTypePeriodType
দারিন দিমিত্রভ

এছাড়াও আপনার প্রস্তাবিত কোডটির অর্থ হ'ল পুরো মডেলটিকে একটি আংশিক টেম্পলেটটিতে উত্তীর্ণ করা হবে যা একটি নির্দিষ্ট সম্পত্তি অ্যাক্সেস করে?
টাইপো জনসন

2
আমি এখন আপনাকে পেতে। আমি <% = এইচটিএমএল.এডিটরটির জন্য (মডেল => মডেল ont কন্ট্রোল.পরিডএন্ডডেট, নতুন। সংশোধনযোগ্য = মডেল। কন্ট্রোল.পরিডএন্ডডেটমোডিফাইয়েবল})%> ব্যবহার করতে এবং আমার কাস্টম এডিটরপ্লেক্স / স্ট্রিংকেক্সে ভিউ ডেটা ["পিরিয়ডএন্ডডেটমোডিফাইয়েবল"] ব্যবহার করতে পারি। ধন্যবাদ
টাইপো জনসন

1
@ জুনিয়রমায়হে, আমি এটিকে বিরক্তিকর সীমাবদ্ধতা বলব না। আপনি যদি আরও সাবধানে চিন্তা করেন তবে আপনি বুঝতে পারবেন যে এটি বোধগম্য। প্রকৃতপক্ষে সম্পাদকটির সহায়তার পুরো বিষয়টি হ'ল আপনার একটি সম্পর্কিত টেম্পলেট থাকতে পারে। এই টেমপ্লেটে কোনও মার্কআপ থাকতে পারে। অগত্যা একটি একক উপাদান। @classউদাহরণস্বরূপ 3 ডিভস ধারণ করে এমন একটি সম্পাদকীয় টেম্পলেটটির জন্য এটি নির্ধারণ করা একেবারেই অর্থবোধ করে না। এইচটিএমএল.টেক্সটবক্সফোর্স সহায়ক আপনাকে এটি সংজ্ঞায়িত করতে দেয় কারণ আপনি জানেন যে এই সহায়কটি কী উত্পন্ন করে - একটি পাঠ্যবাক্স যাতে এটি কোনও ইনপুট উপাদানকে শ্রেণি সংজ্ঞায়িত করে তোলে sense
দারিন দিমিত্রভ

115

এমভিসি 5.1 আপডেট করুন এখন নীচের পদ্ধতির সরাসরি সমর্থন করে, সুতরাং এটি সম্পাদকের ক্ষেত্রেও কাজ করে। http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features (এটি হয় দুর্দান্ত মনের চিন্তাভাবনার একটি বিষয় বা তারা আমার উত্তরটি পড়েন :)

শেষ আপডেট

আপনি যদি নিজের নিজস্ব সম্পাদক টেম্পলেট ব্যবহার করেন বা এমভিসি 5.1 দিয়ে যা এখন সম্পাদকগুলিতে অন্তর্নির্মিত জন্য সরাসরি নীচের পদ্ধতির সমর্থন করে।

@Html.EditorFor(modelItem => item.YourProperty, 
  new { htmlAttributes = new { @class="verificationStatusSelect", style = "Width:50px"  } })

তারপরে আপনার টেমপ্লেটে (এমভিসি 5.1-তে সাধারণ ধরণের জন্য প্রয়োজনীয় নয়)

@Html.TextBoxFor(m => m, ViewData["htmlAttributes"])

5
এই নতুন বৈশিষ্ট্যটি চার বছর আগে জিজ্ঞাসিত মূল সমস্যাটি পুরোপুরি সমাধান করে।
কোডারস্টেভ

1
যদি টেক্সটবক্সফোর্ডের পরিবর্তে এবং সহায়কদের মতো আমি প্রচুর কাস্টম সম্পাদক টেম্পলেট ব্যবহার করি তবে আমি বলব না যে তাদের প্রত্যেকের মধ্যে ভিউডাটা [...] যুক্ত করা একটি দুর্দান্ত ধারণা ... :(
আলেকজান্ডার

42

এমভিসি 5.1 হিসাবে, আপনি এখন নিম্নলিখিতগুলি করতে পারেন:

@Html.EditorFor(model => model, new { htmlAttributes = new { @class = "form-control" }, })

http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features


উপরের লিঙ্কটি মারা গেছে। এটি এমভিসি 5.1 তে পাওয়া যায়, আরও তথ্যের জন্য এখানে: asp.net/mvc/overview/releases/mvc51- রিলেজ- নোটস# নতুন নতুন
আলা মাসউদ

1
ধন্যবাদ, আমি লিঙ্কটিও ঠিক করেছিলাম।
ভিটিফরেস্টার

2
এইচটিএমএলএ্যাট্রিবিউটগুলি কীভাবে মার্জ করবেন?
বার্ট ক্যালিক্স্টো

এটি কেবল অন্তর্নির্মিত / ডিফল্ট EditorForটেম্পলেটগুলির সাথে কাজ করে । আপনি যদি নিজের প্রয়োগ করেন তবে আপনাকে অ্যান্টকের উত্তর অনুসরণ করতে হবে।
mxmissile

6

এখন এএসপি ডট এমভিসি 5.1 এর সমর্থনে একটি বিল্ট পেয়েছে।

রিলিজ নোটস থেকে

আমরা এখন একটি অনামী অবজেক্ট হিসাবে এডিএমএল বৈশিষ্ট্যে পাস করার অনুমতি দিই।

উদাহরণ স্বরূপ:

@Html.EditorFor(model => model, 
              new { htmlAttributes = new { @class = "form-control" }, })

4

এমভিসি 5.1 এডিটরফোরে এইচটিএমএল বৈশিষ্ট্যের জন্য এখানে ভিবি.নেট কোড সিনট্যাক্স

@Html.EditorFor(Function(x) x.myStringProp, New With {.htmlAttributes = New With {.class = "myCssClass", .maxlength="30"}}))

3

কেন শুধু ব্যবহার না

@Html.DisplayFor(model => model.Control.PeriodType)

30
একটি কারণ হ'ল ডিসপ্লেফোর্ড কোনও ইনপুট রেন্ডার করে না, তাই মানটি পোস্টব্যাকে হারিয়ে যায়।
অধ্যাপক 6

2
আরেকটি কারণ হ'ল নির্দিষ্ট পরিস্থিতি যেখানে সম্পাদক বর্তমানে-তবে-সর্বদা লক থাকে না এবং আপনি যোগাযোগ করতে চান যে ডেটা সম্ভাব্য সম্পাদনাযোগ্য - ঠিক এখনই নয়।
মীর

2

আপনি যদি মেটাটাটা ব্যবহার করতে না চান তবে আপনি [UIHint("PeriodType")]সম্পত্তিটি সাজানোর জন্য কোনও বৈশিষ্ট্য ব্যবহার করতে পারেন বা যদি এটি কোনও জটিল ধরণের থাকে তবে আপনাকে কোনও জিনিস সাজাইতে হবে না। এডিটরফোরে এডিটরটিম্পলেটস ফোল্ডারে একটি পিরিওডটাইপ.এএসপিএক্স বা এসএসএক্স ফাইল সন্ধান করা হবে এবং পরিবর্তে এটি ব্যবহার করা হবে।


ধন্যবাদ, আমি যদি তা শেষ করতে পারি তবে যদি / আমার সম্পাদক টেম্পলেটে কেবল কিছু ক্ষেত্রের জন্য প্রয়োজন হয়
টাইপো জনসন

আমি যদিও আপনি বলেছিলেন যে আপনি মডেলটি পরিবর্তন করতে পারবেন না (আপনার কোড নয়), তাই সরাসরি ইউআইআইএনএইচিন্টের সাথে সজ্জিত করা কোনও বিকল্প নয়।
ড্যারেল লি

2

আমি আজ একই ইস্যুতে একটি চেকবাক্সের জন্য কুস্তিগীর হয়েছি যা একটি নোলযোগ্য বুলের সাথে আবদ্ধ, এবং যেহেতু আমি আমার মডেলটি পরিবর্তন করতে পারি না (আমার কোড নয়) আমাকে এটি পরিচালনা করার আরও ভাল উপায় নিয়ে আসতে হয়েছিল। এটি কিছুটা নিষ্ঠুর শক্তি, তবে আমি যে 99% ক্ষেত্রে মুখোমুখি হতে পারি তার ক্ষেত্রে এটি কাজ করা উচিত। প্রতিটি ইনপুট ধরণের জন্য আপনাকে অবশ্যই বৈধ বৈশিষ্ট্যের কিছু ম্যানুয়াল জনসংখ্যা করতে হবে তবে আমি মনে করি আমি তাদের সমস্তটি চেকবক্সের জন্য অর্জন করেছি।

আমার বুলিয়ান। সিএসটিএমএল সম্পাদক টেমপ্লেটে:

@model bool?

@{
    var attribs = new Dictionary<string, object>();
    var validAttribs = new string[] {"style", "class", "checked", "@class",
        "classname","id", "required", "value", "disabled", "readonly", 
        "accesskey", "lang", "tabindex", "title", "onblur", "onfocus", 
        "onclick", "onchange", "ondblclick", "onmousedown", "onmousemove", 
        "onmouseout", "onmouseover", "onmouseup", "onselect"};
    foreach (var item in ViewData) 
    {
        if (item.Key.ToLower().IndexOf("data_") == 0 || item.Key.ToLower().IndexOf("aria_") == 0) 
        {
            attribs.Add(item.Key.Replace('_', '-'), item.Value);
        } 
        else 
        {
            if (validAttribs.Contains(item.Key.ToLower()))
            {
                attribs.Add(item.Key, item.Value);
            }
        }
    }
}

@Html.CheckBox("", Model.GetValueOrDefault(), attribs)

আমি যুক্ত করেছি Dictionary<string,string> attribs = new Dictionary<string,string>();এবং আমার পৃষ্ঠার শীর্ষে blocks ব্লকগুলির attribs.Add("tabindex","16");একটিতে @( )। তারপরে আমি @Html.CheckBox("IsActive", Model.IsActive.HasValue ? Model.IsActive : false, attribs)আমার পৃষ্ঠায় এটি করেছি এবং এটি আমাকে একটি ত্রুটি দেয়: "'System.Web.Mvc.HtmlHelper <MyProject.Models.MyObject>' তে 'চেকবক্স' এবং সেরা এক্সটেনশন পদ্ধতি ওভারলোড 'সিস্টেম.ওয়েব'র সংজ্ঞা নেই। এমভিসি.ইনপুট এক্সটেনশনস.চেকবক্স (System.Web.Mvc.Html হেল্পার, স্ট্রিং.বুল, অবজেক্ট) 'এর কিছু অবৈধ আর্গুমেন্ট রয়েছে "।
vapcguy

2

আপনি এখনও এডিটরফোর্ড ব্যবহার করতে পারেন। ভিউডাটা হিসাবে কেবল শৈলী / যে কোনও এইচটিএমএল বৈশিষ্ট্যটি পাস করুন।

@Html.EditorFor(model => model.YourProperty, new { style = "Width:50px" })

যেহেতু এডিটরফোর্ড রেন্ডার করতে টেমপ্লেটগুলি ব্যবহার করে, আপনি নিজের সম্পত্তির জন্য ডিফল্ট টেম্পলেটটিকে ওভাররাইড করতে এবং ভিউডাটা হিসাবে স্টাইল বৈশিষ্ট্যটি কেবল পাস করতে পারেন।

সুতরাং আপনার এডিটরটিম্পলেটটি নিম্নলিখিতগুলি পছন্দ করতে পারে:

@inherits System.Web.Mvc.WebViewPage<object>

@Html.TextBoxFor(m => m, new { @class = "text ui-widget-content", style=ViewData["style"] })

1
Html.TextBoxFor(model => model.Control.PeriodType, 
    new { @class="text-box single-line"})

আপনি এই মত ব্যবহার করতে পারেন; একই আউটপুট সহ Html.EditorForএবং আপনি আপনার এইচটিএমএল বৈশিষ্ট্যগুলি যুক্ত করতে পারেন


আপনি যে TextBoxForকোনও ধরণের DisplayFormatপ্রয়োগের চেষ্টা করছেন তা উপেক্ষা ব্যতীত ।
এরিক কে

1

ভিউ / শেয়ার / এডিটরটাইপলেটস / মাইটাইপএডিটর.ভিবিএইচটিএমএল টাইপের জন্য কেবল নিজের টেম্পলেট তৈরি করুন

@ModelType MyType

@ModelType MyType
@Code
    Dim name As String = ViewData("ControlId")
    If String.IsNullOrEmpty(name) Then
        name = "MyTypeEditor"
    End If
End Code

' Mark-up for MyType Editor
@Html.TextBox(name, Model, New With {.style = "width:65px;background-color:yellow"})

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

@Html.EditorFor(Function(m) m.MyTypeProperty, "MyTypeEditor", New {.ControlId = "uniqueId"})

ভিবি সিনট্যাক্স ক্ষমা করুন। এটিই আমরা রোল করি।


1

আমার ক্ষেত্রে আমি একটি HTML5 নম্বর ইনপুট সম্পাদক টেম্পলেট তৈরি করার চেষ্টা করছিলাম যা অতিরিক্ত বৈশিষ্ট্যগুলি পেতে পারে। আপনার নিজের এইচটিএমএল সহায়ককে লেখার জন্য একটি সুস্পষ্ট পদ্ধতির বিষয়টি হবে তবে আমার ইতিমধ্যে আমার .্যাসেক্স টেম্পলেটটি ছিল তাই আমি এই পদ্ধতির সাথে চলেছি:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<input id="<%= Regex.Replace(ViewData.TemplateInfo.GetFullHtmlFieldId(""), @"[\[\]]", "_") %>" name="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" type="number" value="<%= ViewData.TemplateInfo.FormattedModelValue %>"
<% if (ViewData["attributes"] != null)
   {
       Dictionary<string, string> attributes = (Dictionary<string, string>)ViewData["attributes"];
       foreach (string attributeName in attributes.Keys){%>
        <%= String.Format(" {0}=\"{1}\"", attributeName, attributes[attributeName])%>
       <% }
   } %> />

এই কুরুচিপূর্ণ বিট একটি সংখ্যা টাইপ ইনপুট তৈরি করে এবং কী "বৈশিষ্ট্যগুলি" সহ একটি ভিউডাটা অভিধানের সন্ধান করে। এটি অভিধানের মাধ্যমে পুনরাবৃত্তি হবে তার মূল / মান জোড়কে বৈশিষ্ট্য হিসাবে যুক্ত করে। আইডি অ্যাট্রিবিউটে রেজেক্সটি সম্পর্কিত নয় এবং সেখানে রয়েছে কারণ যখন কোনও সংগ্রহে ব্যবহৃত হয় তখন GetFullHtmlFieldId()স্কোয়ার ব্র্যাকেট যুক্ত একটি আইডি প্রদান করে []যা এটি সাধারণত আন্ডারস্কোর হিসাবে পালাতে পারে।

এই টেমপ্লেটটিকে এর পরে বলা হয়:

Html.EditorFor(m => m.Quantity, "NumberField", new { attributes = new Dictionary<string, string>() { { "class", "txtQuantity" } } }

ভার্বোস, তবে এটি কাজ করে। আপনি সম্ভবত অভিধান ব্যবহার করার পরিবর্তে বৈশিষ্ট্যের নাম হিসাবে সম্পত্তি নাম ব্যবহার করতে টেমপ্লেটে প্রতিবিম্ব ব্যবহার করতে পারেন।


1

ViewDataনিয়ামক ব্যবহার করে শর্ত সেট করুন

ViewData["Modifiable"] = model.recProcessed;

তারপরে নিয়ন্ত্রণের এইচটিএমএল বৈশিষ্ট্যটি সেট করতে সম্পাদকীয় টেমপ্লেটে এই ভিউডেটাটি ব্যবহার করুন

@Html.RadioButton(prefix, li.Value, li.Selected, @ViewData["Modifiable"].ToString().ToLower() == "true" ? (object)new  { @id = li.Value, @disabled = "disabled" } : new { @id = li.Value })

0

এমভিসি 5.1 এবং উচ্চতর সমাধান (স্থানীয় এইচটিএমএলঅ্যাট্রিবিউটগুলিকে একীভূত করবে এবং এডিটরটিম্পলেটগুলিতে সংজ্ঞায়িত করা হবে):

ভাগ \ EditorTemplates \ String.cshtml:

@Html.TextBoxFor(model => model, new { @class = "form-control", placeholder = ViewData.ModelMetadata.Watermark }.ToExpando().MergeHtmlAttributes(ViewData["htmlAttributes"].ToExpando()))

এক্সটেনশানগুলি:

public static IDictionary<string, object> MergeHtmlAttributes(this ExpandoObject source1, dynamic source2)
{
    Condition.Requires(source1, "source1").IsNotNull().IsLongerThan(0);

    IDictionary<string, object> result = source2 == null
        ? new Dictionary<string, object>()
        : (IDictionary<string, object>) source2;

    var dictionary1 = (IDictionary<string, object>) source1;

    string[] commonKeys = result.Keys.Where(dictionary1.ContainsKey).ToArray();
    foreach (var key in commonKeys)
    {
        result[key] = string.Format("{0} {1}", dictionary1[key], result[key]);
    }

    foreach (var item in dictionary1.Where(pair => !result.ContainsKey(pair.Key)))
    {
        result.Add(item);
    }

    return result;
}

public static ExpandoObject ToExpando(this object anonymousObject)
{
    IDictionary<string, object> anonymousDictionary = new RouteValueDictionary(anonymousObject);
    IDictionary<string, object> expando = new ExpandoObject();
    foreach (var item in anonymousDictionary)
        expando.Add(item);
    return (ExpandoObject)expando;
}

public static bool HasProperty(this ExpandoObject expando, string key)
{
    return ((IDictionary<string, object>)expando).ContainsKey(key);
}

ব্যবহার:

@Html.EditorFor(m => m.PromotionalCode, new { htmlAttributes = new { ng_model = "roomCtrl.searchRoomModel().promoCode" }})

1
ধন্যবাদ, কাজ করে। সব data_xxx বৈশিষ্ট্যাবলী, যেখানে আমি সঙ্গে প্রতিস্থাপন: _ ছিল ছাড়া - যখন ভোটদান source1এবং source2যেমন IDictionary<string, object>। আমি এই ফাংশনটি তৈরি করেছি: private static IDictionary<string, object> ToHtmlAttributesDictionary(this IEnumerable<KeyValuePair<string, object>> dico) { return dico.ToDictionary(s => s.Key.Replace('_', '-'), s => s.Value); }
মারিইন মননিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.