2009-09-24 11 views
23

क्या एएसपी.नेट एमवीसी विचारों में जावास्क्रिप्ट से बचने के लिए कोई उपयोगिता कार्य है? मुझे अक्सर दृश्य से कुछ मूल्यों का उपयोग करके जावास्क्रिप्ट का एक छोटा स्निपेट डालना होगा;विचारों में जावास्क्रिप्ट स्ट्रिंग अक्षर से बचें

<script type="text/javascript"> 
var page = new Page({ currentUser: "<%= Html.JavaScriptEscape(Model.UserName) %>" }); 
page.init(); 
</script> 

मैं, ज़ाहिर है, समारोह अपने आप लिख सकते हैं:

<script type="text/javascript"> 
var page = new Page({ currentUser: "<%= Model.UserName %>" }); 
page.init(); 
</script> 

मैं की तरह कुछ उम्मीद होती है: उदाहरण के लिए मैं कुछ ऐसा हो सकता है। लेकिन चूंकि पहले से ही अंतर्निर्मित उपयोगिताएं HTML एन्कोडिंग बनाती हैं, और चूंकि एएसपी.नेट एमवीसी के विक्रय बिंदुओं में से एक यह है कि <%%> डिफ़ॉल्ट प्रतिपादन मोड है, और जो मैं प्राप्त करने की कोशिश कर रहा हूं वह काफी आम है , यह मुझे आश्चर्यचकित करता है कि मुझे ऐसा कुछ भी क्यों नहीं मिल रहा है जो पहले से ही अंतर्निहित है। उदाहरण के लिए, क्या किसी ऑब्जेक्ट को जेएसओएन को दृश्यों में क्रमबद्ध करने का एक आसान और सुरुचिपूर्ण तरीका है?

या एएसपी.नेट एमवीसी सिद्धांतों के खिलाफ कुछ कर रहा हूं? जब मैंने इस तरह की समस्या को मारा, तो आमतौर पर यह सोचता है कि या तो मैं कुछ गलत कर रहा हूं क्योंकि मुझे लगता है कि ढांचे के डिजाइनरों ने वास्तविक दुनिया परिदृश्यों के बारे में कुछ समय बिताया था।

उत्तर

8

कुछ समय बाद एएसपी.नेट एमवीसी में काम करने के बाद, मैंने निष्कर्ष निकाला कि (सबसे अधिक संभावना है) इसमें कोई बिल्ड-इन सहायक नहीं है। बेशक, यह खुद लिखने के लिए तुच्छ है। यहाँ पूर्णता के लिए के लिए यह है:

using System.Web.Mvc; 
using System.Web.Script.Serialization; 

namespace MyProject.Helpers 
{ 
    public static class JsonExtensions 
    { 
     public static string Json(this HtmlHelper html, object obj) 
     { 
      JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); 
      return jsonSerializer.Serialize(obj); 
     } 
    } 
} 

एक दृश्य में, यह इस प्रकार के रूप में इस्तेमाल किया जा सकता है:

<script type="text/javascript"> 
var page = new Page(<%= Html.Json(new { currentUser: Model.UserName }) %>); 
page.init(); 
</script> 
47

नेट 4 में, HttpUtility वर्ग के लिए स्थिर एन्कोडिंग तरीकों की एक किस्म है इस विशेष उद्देश्य के लिए JavaScriptStringEncode विधि सहित विभिन्न संदर्भ।

हालांकि, JSON deserialization का उपयोग करना अक्सर आसान होता है।

7

MVC 5 में उस्तरा टेम्पलेट का उपयोग कर, निम्नलिखित संभव है:

<script type="text/javascript"> 
    var page = new Page({ currentUser: @Html.Raw(Json.Encode(Model.UserName)) }); 
    page.init(); 
</script> 
0

मेरे मामले में मैं एक स्ट्रिंग एक json वस्तु नहीं की जरूरत है और इस Asp.Net कोर के लिए है:

@functions{ 
    public Microsoft.AspNetCore.Html.IHtmlContent ToJS(string value) 
    { 
     return Html.Raw("'" + value.Replace("'", "\\'").Replace("\r", "\\r").Replace("\n", "\\n") + "'"); 
    } 

    public Microsoft.AspNetCore.Html.IHtmlContent ToJS(int value) 
    { 
     return Html.Raw("" + value); 
    } 
} 

यह 'और रेखा पात्रों के अंत से बच जाएगा। इसके अलावा यह संख्या (int) को एक संख्या के रूप में छोड़ देता है। आवश्यकतानुसार फ्लोट, दशमलव इत्यादि को शामिल करने के लिए इसे ओवरलोड किया जा सकता है।

var serverName = @ToJS(m.ServerName); 
var appSiteUrl = @ToJS(m.SiteUrl); 
var facebookId = @ToJS(m.FacebookAppId); 
:

तो, मैं इसके बारे में सोचो या प्रत्येक प्रकार के लिए कुछ अलग करने के लिए की जरूरत नहीं है

संबंधित मुद्दे