【问题标题】:Razor with Javascript带有 Javascript 的剃须刀
【发布时间】:2014-09-21 23:48:05
【问题描述】:
 @if (Model.PaymentMethodTypeId == (int) PaymentMethodType.PayPal)
 {
     var url = @MyLibraryHtml.JavascriptEncodeUrl(Url.RewriteAction("SaveNewPaymentMethod", "PaymentMethods"));
     var args = form.serialize();
     @Html.Raw(" var url = ")
 }

if 块内部的代码是 Javascript,但正如我所料,Razor 将 var url 和 var arg 视为 .NET 变量。

我知道我可以使用 Html.Raw,但是对于这个问题还有其他更好的解决方案吗,因为我相信 Html.Raw 会破坏可读性

【问题讨论】:

  • 我不确定 js 和 c# 的这种混合是否是好的解决方案。我认为最好从 c# 初始化一些 js var 然后在 js 中进行 cndition 或使用 data- 属性将数据传递给 js。通常将 js 与 c#(razor) 代码分开。有人同意吗?
  • @py3r3str 实际上你是对的,因为这是一个业务逻辑,它必须在控制器中完成,但是我正在更新这段代码,它就像以前一样,所以我没有机会改变方式我正在做的事情

标签: javascript asp.net-mvc razor


【解决方案1】:

您可以使用 <text></text> 元素告诉 Razor if 内的代码应该被视为“文本”而不​​是 c# 代码:

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

或者,如果您只有几行,您可以使用 @: 来“转义”单行:

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

【讨论】:

  • 感谢您的回答, 似乎是最好的
【解决方案2】:

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

但是,编写服务器生成的 Javascript 代码通常是个坏主意;它相当不可读,而且很容易造成 XSS 漏洞。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2011-05-28
    相关资源
    最近更新 更多