রেজার এমভিসি 3 ব্যবহার করে শর্তাধীন এইচটিএমএল বৈশিষ্ট্য


100

ভেরিয়েবল strCSSClass প্রায়শই একটি মান থাকে তবে কখনও কখনও খালি থাকে।

আমি এই ইনপুট উপাদানটির এইচটিএমএলে একটি খালি শ্রেণি = "" অন্তর্ভুক্ত করতে চাই না, যার অর্থ যদি সিআরসিএসএস ক্লাস খালি থাকে তবে আমি শ্রেণি = বৈশিষ্ট্যটি মোটেই চাই না।

শর্তযুক্ত এইচটিএমএল বৈশিষ্ট্যটি করার একটি উপায় নীচে রয়েছে:

<input type="text" id="@strElementID" @(CSSClass.IsEmpty() ? "" : "class=" + strCSSClass) />

এটি করার আরও কি মার্জিত উপায় আছে? বিশেষত এমন এক যেখানে আমি একই সিনট্যাক্সটি অনুসরণ করতে পারতাম উপাদানটির অন্যান্য অংশগুলিতে ব্যবহার করা হয়: শ্রেণি = "@ strCSSClass"?

উত্তর:


161

আপনি এটি রেজারের জন্য প্রধানমন্ত্রী আমার কাছ থেকে শুনেন নি, তবে রেজার 2 (ওয়েব পৃষ্ঠাগুলি 2 এবং এমভিসি 4) তে আমাদের শর্তসাপেক্ষ বৈশিষ্ট্য রেজারে নির্মিত হবে (এমভিসি 4 আরসি সফলভাবে পরীক্ষিত হয়েছে), সুতরাং আপনি কেবল বলতে পারেন এই জাতীয় জিনিস ...

<input type="text" id="@strElementID" class="@strCSSClass" />

যদি strCSSClass নাল হয় তবে শ্রেণীর বৈশিষ্ট্যটি মোটেও রেন্ডার হবে না।

এসএসএসএইচএইচএইচ ... বলবেন না। :)


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

4
তবে আমি কীভাবে রেজার বৈশিষ্ট্যগুলি অন্য পাঠ্যের সাথে একত্রিত করতে পারি? আমাকে নিম্নলিখিতগুলি তৈরি করতে হবে: ... id = "track_@track.ID"। আমি ... আইডি = "ট্র্যাক 3" এর মতো কিছু প্রত্যাশা করেছি, তবে এটি নিম্নলিখিত আউটপুটটি উত্পন্ন করেছে: ... আইডি = "ট্র্যাক_@ট্র্যাক.আইডি" ...
লেজারসন

4
আপনি রেজারকে চারপাশে পেরেন রেখে কোডটি মূল্যায়ন করতে বাধ্য করতে পারেন। আইডি = "ট্র্যাক _ @ (ট্র্যাক.আইডি)"
এরিক পোর্টার ২

4
এটি এমভিসি 4 এর সাথে সফলভাবে কাজ করে এমন ইঙ্গিতযুক্ত নোটটি আপনি এমভিসি 3 এ থাকলে নীচে আমার উত্তরটি দেখুন।
অ্যারোনএলএস

4
@ এরিকপোর্টার দয়া করে আমার এইচটিএমএল দিয়ে মেস করবেন না !! আরো দেখুন stackoverflow.com/questions/9234467/... জন্য অন্যান্য খারাপ আচরণ ভাল হিসাবে এই
eaglestorm

126

দ্রষ্টব্য আপনি এরকম কিছু করতে পারেন (কমপক্ষে এমভিসি 3 তে):

<td align="left" @(isOddRow ? "class=TopBorder" : "style=border:0px") >

আমি বিশ্বাস করলাম রেজার অ্যাড যুক্ত ছিল আসলে ব্রাউজার ছিল। যেমন এমভিসি 4 দিয়ে পরীক্ষা করার সময় রিসম ইঙ্গিত করেছিলেন (আমি এমভিসি 3 দিয়ে পরীক্ষা করিনি তবে আমি ধারণা করি আচরণ পরিবর্তন হয়নি), এটি আসলে উত্পাদন করে class=TopBorderতবে ব্রাউজারগুলি এই জরিমানাটিকে পার্স করতে সক্ষম হয়। এইচটিএমএল পার্সারগুলি অনুপস্থিত বিশিষ্ট উদ্ধৃতিগুলিতে কিছুটা ক্ষমা করছে, তবে আপনার স্পেস বা নির্দিষ্ট অক্ষর থাকলে এটি ভেঙে যেতে পারে

<td align="left" class="TopBorder" >

বা

<td align="left" style="border:0px" >

আপনার নিজস্ব উদ্ধৃতি সরবরাহ করার সাথে কি ভুল হয়

যদি আপনি নেস্টেড কোটগুলির জন্য কিছু সাধারণ সি # কনভেনশন ব্যবহার করার চেষ্টা করেন তবে রেজিস্টর সেগুলি নিরাপদে পালানোর চেষ্টা করছে বলে আপনি দর কষাকষির চেয়ে আরও বেশি উদ্ধৃতি পাবেন। উদাহরণ স্বরূপ:

<button type="button" @(true ? "style=\"border:0px\"" : string.Empty)>

এই উচিত নির্ণয় <button type="button" style="border:0px">কিন্তু রাজো C # এর থেকে সব আউটপুট পালাতে এবং এইভাবে সৃষ্টি করে:

style=&quot;border:0px&quot;

আপনি কেবল নেটওয়ার্কটি জুড়ে প্রতিক্রিয়া দেখলে এটি দেখতে পাবেন। আপনি যদি কোনও এইচটিএমএল পরিদর্শক ব্যবহার করেন তবে প্রায়শই আপনি কাঁচা এইচটিএমএল নয়, আসলে ডিওএমটি দেখেন। ব্রাউজারগুলি এইচটিএমএলকে ডিওএমে পার্স করে এবং পার্সিং-পরে ডিওএমের উপস্থাপনা ইতিমধ্যে কিছু চমত্কার প্রয়োগ করেছে। এক্ষেত্রে ব্রাউজারটি দেখায় বৈশিষ্ট্যের মানটির চারপাশে কোনও উদ্ধৃতি নেই, এগুলি যুক্ত করুন:

style="&quot;border:0px&quot;"

তবে ডিওএম ইন্সপেক্টরতে এইচটিএমএল চরিত্রের কোডগুলি সঠিকভাবে প্রদর্শিত হয় যাতে আপনি প্রকৃতপক্ষে দেখতে পান:

style=""border:0px""

ক্রোমে, আপনি যদি ডান ক্লিক করেন এবং এইচটিএমএল সম্পাদনা নির্বাচন করেন, এটি আবার স্যুইচ করে যাতে আপনি সেইসব বাজে এইচটিএমএল চরিত্রের কোডগুলি দেখতে পারেন, এটি পরিষ্কার করে দেয় যে আপনার আসল বাইরের উক্তি এবং এইচটিএমএল এনকোডেড অভ্যন্তরীণ উদ্ধৃতি রয়েছে।

সুতরাং নিজেকে উদ্ধৃত করার চেষ্টা করার সাথে সমস্যা হ'ল রেজার এগুলি থেকে রক্ষা পেয়েছে।

আপনি যদি উদ্ধৃতিগুলির সম্পূর্ণ নিয়ন্ত্রণ চান

উদ্ধৃতি অব্যাহতি রোধ করতে এইচটিএমএল.রো ব্যবহার করুন:

<td @Html.Raw( someBoolean ? "rel='tooltip' data-container='.drillDown a'" : "" )>

রেন্ডার্স হিসাবে:

<td rel='tooltip' title='Drilldown' data-container='.drillDown a'>

উপরেরটি পুরোপুরি নিরাপদ কারণ আমি কোনও ভেরিয়েবল থেকে কোনও এইচটিএমএল আউটপুট দিচ্ছি না। জড়িত একমাত্র পরিবর্তনশীল হ'ল তিনটি শর্ত। তবে সাবধান হোন যে ব্যবহারকারী সরবরাহিত ডেটা থেকে স্ট্রিং তৈরি করতে পারলে এই শেষ কৌশলটি আপনাকে কিছু সুরক্ষিত সমস্যা দেখা দিতে পারে। উদাহরণস্বরূপ, যদি আপনি ডেটা ক্ষেত্রগুলি থেকে ব্যবহারকারী সরবরাহিত ডেটা থেকে উদ্ভূত কোনও বৈশিষ্ট্য তৈরি করেন, এইচটিএমএল ব্যবহার করেন aw রা'র অর্থ স্ট্রিংটিতে অ্যাট্রিবিউট এবং ট্যাগের অকাল শেষ হতে পারে, তারপরে একটি স্ক্রিপ্ট ট্যাগ শুরু করতে হবে যা বর্তমানে লগ ইন করা পক্ষে কিছু করে ব্যবহারকারী (সম্ভবত লগ ইন করা ব্যবহারকারীর চেয়ে পৃথক)। সমস্ত ব্যবহারকারীর ছবির তালিকার সাথে আপনার একটি পৃষ্ঠা থাকতে পারে এবং আপনি প্রতিটি ব্যক্তির ব্যবহারকারীর নাম হিসাবে একটি সরঞ্জামদণ্ড স্থাপন করছেন এবং একজন ব্যবহারকারী নিজের নাম রেখেছেন'/><script>$.post('changepassword.php?password=123')</script> এবং এখন অন্য যে কোনও ব্যবহারকারী এই পৃষ্ঠাটি দেখুন তাদের তাত্ক্ষণিকভাবে তার পাসওয়ার্ডটি এমন পাসওয়ার্ডে পরিবর্তিত হয়ে গেছে যা দূষিত ব্যবহারকারী জানেন।


এটা খুব ভালো ধারণা! এবং প্রকৃতপক্ষে, এটি এটিকে বেশিরভাগ পরিস্থিতিতে পাঠযোগ্য এবং ব্যবহারযোগ্য করে তোলে makes
Dmytro শেভচেনকো

আমার প্রশ্নের উদাহরণে আমি এটিই করছিলাম। আরও বিস্তৃত ব্যাখ্যা এবং উদাহরণের জন্য ধন্যবাদ। :)
টনি 722

4
যদিও জায়গা থেকে সাবধান। "শৈলী = প্রদর্শন: কিছুই নয়;" কোনও হিসাবে রেন্ডার করে না; = "": = "" শৈলী = "প্রদর্শন"
ডাব্লু কেইঙ্কশ

4
সুতরাং কেন এই কাজটি পুনরায় হয় না: যাদু ডাবল উক্তি <স্প্যান @ (সত্য? "শ্রেণি = লোগো-মালিক": স্ট্রিং.এম্পটি) /> এটি কেবল <স্প্যান শ্রেণি = লোগো-মালিক />
ধর্মান্তরের

4
@ অ্যারোনলস হ্যাঁ ঠিক সেভাবেই। এটি বুঝতে পারে না যে ব্রাউজারটি (ক্রোম 40 / FF33.1 / আইই 10) যে কোনও কিছুকে প্রভাবিত করবে যেহেতু এটি সার্ভারটি উত্পাদিত মার্কআপ এবং যদি তাই হয় তবে কেবলমাত্র এই দুটি শ্রেণীর বৈশিষ্ট্যগুলি কীভাবে আসবে তবে জিজ্ঞাসা বোতামের শ্রেণি বৈশিষ্ট্য বা এমনকি টাইপ = তিনটি বোতামের "বোতাম" বৈশিষ্ট্য। অবশ্যই একটি সার্ভার জিনিস আইএমএইচও যেহেতু আমি একই ফলাফল আইই / ফায়ারফক্স / ক্রোমের জন্য বিশ্বজুড়ে ডটেড আউজুয়াল ভার্চুয়াল মেশিনগুলির একটিতেও তৈরি করতে পারি।
রিজম

12

আমি অনুমান করি যে আরও কিছু সুবিধাজনক এবং কাঠামোগত উপায় হ'ল এইচটিএমএল সহায়ক ব্যবহার করা। আপনার দৃষ্টিতে এটির মতো দেখতে পাওয়া যেতে পারে:

@{
 var htmlAttr = new Dictionary<string, object>();
 htmlAttr.Add("id", strElementId);
 if (!CSSClass.IsEmpty())
 {
   htmlAttr.Add("class", strCSSClass);
 }
}

@* ... *@

@Html.TextBox("somename", "", htmlAttr)

যদি এই উপায়টি আপনার পক্ষে কার্যকর হয় তবে আমি htmlAttrআপনার মডেলটিতে অভিধানটি সংজ্ঞায়িত করার পরামর্শ দিচ্ছি যাতে আপনার দৃষ্টিতে কোনও @{ }যুক্তিযুক্ত ব্লকের প্রয়োজন হয় না (আরও স্পষ্ট হয়ে উঠুন)।


4
-1, ভিউগুলিতে যুক্তি দেওয়ার জন্য কাউকে কখনও সুপারিশ করবেন না। নতুন মতামতগুলি কেবল রেন্ডারিংয়ের জন্য দায়বদ্ধ হওয়া উচিত। পরিবর্তে একটি এইচটিএমএল হেল্পার উদাহরণ যুক্ত করুন এবং আমি আপনাকে +1 দেব।
jgauffin

4
জিনিসগুলিতে আমি কোড ব্লকটি ব্যবহার করতে পারি তা পরীক্ষা করতে - এটি আরও দ্রুত। এবং আমার সুপারিশটি ছিল এই ব্লকটিকে মডেল হিসাবে স্থানান্তর করা।
ইয়াসচুর

4
হ্যাঁ, তবে উত্তরগুলি সর্বোত্তম অনুশীলন প্রদর্শন করবে এবং দ্রুত এবং নোংরা সংস্করণ নয় যা কোড রক্ষণাবেক্ষণকে দুঃস্বপ্ন করে night
jgauffin

@ জাগাফিন আমার মনে হয় এখানে এইচটিএমএল সহায়ক অপ্রয়োজনীয়। আমার উত্তর দেখুন।
gdoron মনিকা

+1 @ ইয়াসচুর আপনার উত্তর অনুপ্রেরণামূলক। ভাল কাজগুলো করতে থাকো. অর্থাত্ সি # স্পষ্ট রূপান্তর বৈশিষ্ট্য সহ, আমরা এই উত্তরটি আরও বেশি বাড়িয়ে তুলতে পারি। সমস্ত কোড একটি নির্দিষ্ট উপায়ে আকার করতে হয় না। সর্বদা আরও ভাল উপায় আছে যা সম্পর্কে আমরা অবগত নই। এবং কিছু প্রকল্প কোড সংস্থার পক্ষে হয়। কোড সংস্থা অনুশীলন করে ধারণা নয়!
বাঁশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.