asp.net-mvc: জেএস ফাইলে রেজার '@' প্রতীক


90

আমার কাছে .csHtmlজাভাস্ক্রিপ্ট ফাংশন সহ একটি- রেজার ফাইল রয়েছে যা এজ্যাক্স @Url.ContentURL এর জন্য সি # ফাংশনটি ব্যবহার করে uses
আমি আমার ফাংশনটি .jsআমার ভিউ থেকে রেফারেন্স করা কোনও ফাইলে নিয়ে যেতে চাই ।

সমস্যাটি হ'ল জাভাস্ক্রিপ্ট @প্রতীকটি "জানে না" এবং সি # কোডটি বিশ্লেষণ করে না। "@" প্রতীক সহ ফাইলগুলি থেকে
রেফারেন্স দেওয়ার কোনও উপায় আছে কি .js?


4
হয়তো এই সাহায্য করে (উত্তর দেখুন) stackoverflow.com/questions/7892793/ajax-succes-function
আন্দ্রেই Khrystyanovich

উত্তর:


87

আপনি এইচটিএমএল 5 data-*বৈশিষ্ট্য ব্যবহার করতে পারেন । ধরা যাক যে কোনও ডিওএম এলিমেন্ট যেমন একটি ডিভ ক্লিক করা হয় তখন আপনি কিছু ক্রিয়া সম্পাদন করতে চান। সুতরাং:

<div id="foo" data-url="@Url.Content("~/foobar")">Click me</div>

এবং তারপরে আপনার পৃথক জাভাস্ক্রিপ্ট ফাইলে আপনি DOM এর সাথে আপত্তিজনকভাবে কাজ করতে পারেন:

$('#foo').click(function() {
    var url = $(this).data('url');
    // do something with this url
});

আপনার জাভাস্ক্রিপ্ট ফাইলগুলিতে আপনাকে কোনও সার্ভার সাইড ট্যাগের প্রয়োজন ছাড়াই মার্কআপ এবং স্ক্রিপ্টের মধ্যে বিশুদ্ধ পৃথকীকরণ থাকতে পারে।


ধন্যবাদ আমি মনে করি একাধিক মানের জন্য মাথাব্যথা হতে পারে। প্রথমত আমি ভেবেছিলাম এটি আমার সমস্যার সমাধান করতে পারে তবে চেষ্টা করার পরে আমি আমার কোডে অনেকগুলি রেফারেল পেয়েছি এবং অন্য কোনও উপায় সন্ধান করার সিদ্ধান্ত নিয়েছি।
কিউমাস্টার

19

ঠিক আছে, আমি স্নাতকের উপর একটি রেজার ইঞ্জিন পেয়েছি যা এটি করে! অর্থ @সিনট্যাক্স সমাধান !
এটির নাম রেজারজেএস

Nuget প্যাকেজ


2016 আপডেট:
প্যাকেজটি 5 বছরের জন্য আপডেট করা হয়নি এবং প্রকল্প সাইটের লিঙ্কটি মারা গেছে। লোকদের আর এই লাইব্রেরি ব্যবহার করার পরামর্শ দিচ্ছি না।


আপনি কি এটি দেখতে পারেন? stackoverflow.com/questions/27702322/…
একটি কোডার

প্রথম লিঙ্কটি নষ্ট হয়েছে
মেমেট ওলসেন

@ মেমিট ওলসেন, সত্যিই দুঃখিত, তবে আমি এর একটি অনুলিপি খুঁজে পাচ্ছি না, তাই আমি এটি সরিয়ে
ফেলেছি

@ জিডোরন, কোন সমস্যা নেই আমি আপনাকে মৃত লিঙ্কটি সম্পর্কে জানাতে চেয়েছিলাম। যেমনটি আপনি বলেছেন, প্যাকেজটি 5 বছরের জন্য আপডেট করা হয়নি তাই এটি যেভাবেই সম্ভবত ব্যবহার করা খারাপ ধারণা।
মেমেট ওলসেন

10

সমস্যাটি মোকাবেলার একটি উপায় হ'ল:

জাভাস্ক্রিপ্টের কার্যের সাথে আংশিক দৃশ্য যুক্ত করা হচ্ছে।
এইভাবে আপনি @প্রতীকটি ব্যবহার করতে পারেন এবং আপনার সমস্ত javascriptক্রিয়াকলাপ দৃশ্য থেকে পৃথক করা হয়েছে।


9

আপনার কাছে দুটি বিকল্প রয়েছে:

  • ফাংশনে প্যারামিটার হিসাবে মানটি এবং ভিউতে তারের আপ ব্যবহার করুন
  • একটি নেমস্পেস তৈরি করুন (পাবলিক স্তরের ভেরিয়েবলের পরিবর্তে যা জেএসে খারাপ অভ্যাস হিসাবে বিবেচিত হয়) এবং পৃষ্ঠার শীর্ষে এই মানটি সেট করুন এবং তারপরে এটি আপনার জেএসে ব্যবহার করুন

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

 var MyCompany = 
 {
   MyProject: {
                  MyVariable:""
               }
  };

এবং তারপরে আপনার দৃষ্টিতে এটি সেট করুন:

MyCompany.MyProject.MyVariable = @....

হালনাগাদ

আপনি হয়ত ভাবছেন যে মিলনের কারণে কোনওটিই ভাল নয়, ভাল এটি সত্য, আপনি জেএস এবং দর্শন করছেন। এ কারণেই স্ক্রিপ্টগুলি যে স্থানে চলছে সেগুলি সম্পর্কে অবশ্যই তাকে অবহেলা করা উচিত তাই এটি ফাইলগুলির অপ-অনুকূল সংগঠনের লক্ষণ।

যাইহোক, ভিউ ইঞ্জিন তৈরি করতে এবং রেজারের বিপরীতে জেএস ফাইলগুলি চালানো এবং ফলাফলগুলি ফেরত পাঠানোর জন্য তৃতীয় বিকল্প রয়েছে। এটি ক্লিনার তবে অনেক ধীরগতির তাই প্রস্তাবিতও নয়।


4
+1 আমি প্রথম পদ্ধতিটি করি। আপনার প্রয়োজন সমস্ত ডেটা পাস করে আপনার ভিউ থেকে একটি সূচনা ফাংশনটি কল করুন।
রিচার্ড ডাল্টন

ধন্যবাদ, দ্বিতীয় পদ্ধতিটি ভিউ এবং জেএস ফাইলের মধ্যে কোনও খারাপ মিলন নয়? আপনার কি আরও ভাল উপায় আছে?
gdoron মনিকা

দুজনেই মিলন করছেন। রেন্ডারিংয়ের আগে জেএস ফাইলগুলি প্রসেস করার জন্য কোনও ভিউ ইঞ্জিন না লিখলে অস্বস্ত হওয়ার কোনও উপায় নেই। আমার আপডেট দেখুন।
আলিওস্টাড

আমি যেভাবে পরামর্শ দিলাম সে সম্পর্কে কী? stackoverflow.com/questions/7902213/...
gdoron মনিকা সমর্থন করছে

ঠিক আছে। আমার +1। হয় আংশিক বা সম্পূর্ণ দর্শন, কিছু পরিবর্তন করে না। এটি সমস্ত জেএসের সাথে সংযোগের দৃশ্য।
আলিওস্টাড

7

@আপনার .js ফাইলে ভেরিয়েবলটি পেতে আপনাকে একটি বৈশ্বিক ভেরিয়েবল ব্যবহার করতে হবে এবং সেই .js ফাইলটি ব্যবহার করে এমন এমভিসি ভিউ থেকে সেই ভেরিয়েবলের মান সেট করতে হবে।

জাভাস্ক্রিপ্ট ফাইল:

var myValue;

function myFunc() {
  alert(myValue);
}

এমভিসি ফাইল দেখুন:

<script language="text/javascript">
    myValue = @myValueFromModel;
</script>

কেবলমাত্র নিশ্চিত হয়ে নিন যে আপনার ফাংশনে যে কোনও কল ঘটেছে তার পরে মানটি সেট করা হয়েছে happen


4
ফাংশনটির প্যারামিটার হিসাবে সরাসরি আমারভ্যালু পাস করার বিষয়ে কী? আমি গ্লোবালগুলির উপর নির্ভর করার চেয়ে পরমের সাথে সুস্পষ্ট আহ্বান জানাতে পছন্দ করি তবে আমি জাভাস্ক্রিপ্টে তেমন আগ্রহী নই তাই আমি বিশ্বব্যাপী থাকার কোনও গুরুত্বপূর্ণ দিকটি মিস করতে পারি।
বিগমাইক

@ বিগমাইক: অবশ্যই গ্রহণযোগ্য। আমি উপরে যে পদ্ধতিটি উপস্থাপন করেছি তা কেবল এক সাথে একাধিক ফাংশনে ভেরিয়েবলকে উপলব্ধ করে তোলে তবে পরামিতিগুলি ব্যবহার করা ঠিক ততটাই ভাল।
জোয়েল ইথারটন

বিবৃতির জন্য ধন্যবাদ. মডেলটির কিছু ধরণের js অবজেক্ট সংস্করণ স্বয়ংক্রিয়ভাবে পাওয়া ভাল হবে (মডেল শ্রেণীর বৈশিষ্ট্যগুলির মাধ্যমে দুর্দান্ত হবে), এটি কেবল একটি প্যাটার্ন এবং একটি সম্পূর্ণ নেমস্পেস সচেতন পরিবর্তনশীল সমাধান যুক্ত করবে। আমি অনুমান করি যে বড় সমস্যাটি হ'ল কীভাবে ব্রাউজারে প্রেরিত উত্পন্ন এইচটিএমএল কোডটি সরাসরি ইনজেক্ট করা যায় (সরাসরি <script> ট্যাগের মাধ্যমে)। আমার মনে হয় আমার বর্তমান প্রকল্পটি শেষ হওয়ার সাথে সাথে আমি এটিতে কিছু পরীক্ষা-নিরীক্ষা করব।
বিগমাইক

@BigMike এই DataContractJsonSerializer শ্রেণী (ব্যবহার করে সম্পন্ন করার জন্য মোটামুটি সহজ হওয়া উচিত msdn.microsoft.com/en-us/library/... )। এটি আপনার শ্রেণীর একটি JSON সংস্করণ তৈরি করবে যা ভিউতে বিভক্ত হতে পারে।
জোয়েল ইথারটন

4

সম্ভবত এটি সঠিক পদ্ধতির নয়। উদ্বেগের বিচ্ছেদ বিবেচনা করা। data injectorআপনার নিজের JavaScriptক্লাসে একটি থাকা উচিত এবং যা বেশিরভাগ ক্ষেত্রে ডেটা হয় JSON

আপনার scriptফোল্ডারে একটি জেএস ফাইল তৈরি করুন এবং আপনার এই রেফারেন্সটি যুক্ত করুনView

<script src="@Url.Content("~/Scripts/yourJsFile.js")" type="text/javascript"></script>

এখন, JavaScriptআপনার একটি আক্ষরিক শ্রেণীর বিবেচনা করুন yourJsFile.js:

var contentSetter = {
    allData: {},
    loadData: function (data) {
        contentSetter.allData = eval('(' + data + ')');
    },
    setContentA: function () {
        $("#contentA").html(allData.contentAData);
    },
    setContentB: function () {
        $("#contentB").html(allData.contentAData);
    }
};

একটি ক্লাস ঘোষণা

public class ContentData
{
    public string ContentDataA { get; set }
    public string ContentDataB { get; set }
}

এখন, আপনার Actionএটি থেকে :

public ActionResult Index() {
    var contentData = new ContentData();
    contentData.ContentDataA = "Hello";
    contentData.ContentDataB = "World";
    ViewData.Add("contentData", contentData);
}

এবং আপনার দর্শন থেকে:

<div id="contentA"></div>
<div id="contentB"></div>

<script type="text/javascript">
    contentSetter.loadData('@Json.Encode((ContentData) ViewData["contentData"])');
    contentSetter.setContentA();
    contentSetter.setContentB();
</script>

সুন্দর! তবে আমি মনে করি এটি খুব জটিল ... আমার উত্তর সম্পর্কে আপনার কী ধারণা? stackoverflow.com/questions/7902213/… । আপনি যেভাবে কন্টেন্টএডটা লিখেছেন সেটকন্টেন্টবিতে কপির পেস্ট ত্রুটি করেছেন। ধন্যবাদ!
gdoron মনিকে

4
@ জিডোরন আমাকে বিশ্বাস করুন, জেএস ক্লাস পরিচালনা করা এবং বিচ্ছেদ বিবেচনা করা আপনার জীবন রক্ষাকারী যখন আপনার একটি বিশাল প্রকল্প হয়
আব্দুল মুনিম ২

4

আমি সম্প্রতি এই বিষয়টি সম্পর্কে ব্লগ করেছি: আংশিক রেজার দর্শন ব্যবহার করে বাহ্যিক জাভাস্ক্রিপ্ট ফাইলগুলি তৈরি করা

আমার সমাধানটি হ'ল একটি কাস্টম অ্যাট্রিবিউট ( ExternalJavaScriptFileAttribute) ব্যবহার করুন যা আংশিক রেজার ভিউটি যেমনটি উপস্থাপন করে এবং তারপরে আশেপাশের <script>ট্যাগগুলি ছাড়াই এটি প্রদান করে । এটি এটিকে বৈধ বাহ্যিক জাভাস্ক্রিপ্ট ফাইল হিসাবে তৈরি করে।


2

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

<script type="text/javascript">
function MyFunction(somethingPresentInTheView) {
  alert(somethingPresentInTheView);
}
</script>

দর্শনে আমি ফাংশন অনুরোধের মাধ্যমে যুক্ত করি (কেবল একটি উদাহরণ):

<input type='button' onclick="MyFunction('@Model.PropertyNeeded')" />

1

আমি মনে করি আপনি সেই জেএস কোডটি ভিউতে রেখে আটকে আছেন। রেজার পার্সার, যতদূর আমি জানি, .js ফাইলগুলিতে তাকাবে না, সুতরাং আপনার কাছে যা ব্যবহার করে @তা কাজ করবে না। প্লাস, যেমন আপনি স্পট করেছেন, জাভাস্ক্রিপ্ট নিজেই এই @চরিত্রটি বিনা কারণে ঝুলতে পছন্দ করে না, অন্যথায়, বলুন, স্ট্রিংয়ে।

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