2014-09-21 73 views
1
@if (Model.PaymentMethodTypeId == (int) PaymentMethodType.PayPal) 
{ 
    var url = @MyLibraryHtml.JavascriptEncodeUrl(Url.RewriteAction("SaveNewPaymentMethod", "PaymentMethods")); 
    var args = form.serialize(); 
    @Html.Raw(" var url = ") 
} 

如果块代码是Javascript,但如我所料,Razor将var url和var arg视为.NET变量。带有Javascript的剃刀

我知道我可以使用Html.Raw但有此问题的任何其他更好的解决办法,因为我相信,Html.Raw打破可读性

+0

我不确定这样的js和c#的混合是不错的解决方案。我认为最好是初始化一些js var form c#,然后在js中执行cndition或使用data-attribute将数据传递给js。一般保持js与c#(剃刀)代码分离。任何人同意? – py3r3str 2014-09-21 16:16:33

+0

@ py3r3str其实你是对的,因为这是一个业务逻辑,它必须在控制器上完成,但是我正在更新这段代码,它和以前一样,所以我没有机会改变我在做的方式 – 2014-09-21 16:18:24

回答

1

可以使用<text></text>元素告诉剃须刀里面的代码另外

@if (Model.PaymentMethodTypeId == (int) PaymentMethodType.PayPal) 
{ 
    <text> 
    var url = @MyLibraryHtml.JavascriptEncodeUrl(Url.RewriteAction("SaveNewPaymentMethod", "PaymentMethods")); 
    var args = form.serialize(); 
    </text> 
} 

如果你只有几行,你可以使用@:“逃离”单线条:if应被视为“文本”,而不是C#代码

@if (Model.PaymentMethodTypeId == (int) PaymentMethodType.PayPal) 
{ 
    @:var url = @MyLibraryHtml.JavascriptEncodeUrl(Url.RewriteAction("SaveNewPaymentMethod", "PaymentMethods")); 
    @:var args = form.serialize(); 
} 
+0

感谢答案,似乎是最好的 – 2014-09-21 15:50:25

1

您需要将块的内容包装在<text>标签中,以强制Razor将其视为标记而不是服务器端代码。

但是,编写服务器生成的Javascript代码通常是一个坏主意;这是相当不可读的,并且很容易制作XSS孔。

相反,您应该将服务器端代码存储在data-属性中,并以普通的JS代码读取它们。