在MVC视图Razor中正确使用引号

时间:2013-04-11 13:52:37

标签: asp.net-mvc razor

我在ASP.Net Razer视图中使用引号时遇到了一些困难,因为我一直在用'

替换它们

例如,如果我输入:

@{string test = "String 'with' quotes"}
@test

我最终得到了:

String 'with' quotes

在上面的例子中,这是可取的。

然而,请采用第二个例子:

@{string myJSFunction = myJSFunction('myString')"}
@myJSFunction 

我最终得到了:

myJSFunction('myString')

导致javascript功能损坏。

我尝试用\删除引号,但它们似乎没有任何效果。

以下是我遇到的实际问题:

@using (Ajax.BeginForm(
  "_MonthRanges", 
  "Projects", 
  new { id = ViewBag.InputResourceID }, 
  new AjaxOptions { 
      HttpMethod = "POST", 
      UpdateTargetId = "MonthRanges", 
      InsertionMode = InsertionMode.Replace,
      OnComplete = @myJSFunction
}))

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

@运算符始终对字符串进行HTML编码。如果您需要原始字符串值,请使用@Html.Raw(myJSFunction)

答案 1 :(得分:1)

在剃刀中,@将进行编码和渲染。尝试使用Html.Raw方法。此方法返回非HTML编码的标记。

@Html.Raw(myJSFunction)

因此,如果要在脚本块中执行该功能,可以像

那样执行
@{string myJSFunction = "alert('Rise and Shine')";}
<script type="text/javascript">  
    @Html.Raw(myJSFunction)
</script>

答案 2 :(得分:1)

已经提到了你的问题的解决方案(Html.Raw()),但我不确定为什么你在给出的代码示例中使用@。从它的外观来看,当你尝试分配它时,你已经在代码块中,所以为什么要使用剃刀。

@using (Ajax.BeginForm(
  "_MonthRanges", 
  "Projects", 
  new { id = ViewBag.InputResourceID }, 
  new AjaxOptions { 
      HttpMethod = "POST", 
      UpdateTargetId = "MonthRanges", 
      InsertionMode = InsertionMode.Replace,
      OnComplete = @myJSFunction
}))

应该是

@using (Ajax.BeginForm(
  "_MonthRanges", 
  "Projects", 
  new { id = ViewBag.InputResourceID }, 
  new AjaxOptions { 
      HttpMethod = "POST", 
      UpdateTargetId = "MonthRanges", 
      InsertionMode = InsertionMode.Replace,
      OnComplete = myJSFunction
}))

@告诉StreamWriter页面将结果写入响应,因此打算在HtmlEncoding之后注入页面。使用Html.Raw会绕过Html编码方面,但在你的情况下你不是自己直接把它写在页面上,你让Html.BeginForm处理它,所以你不需要在你的{的赋值中使用@ {1}}功能。

UPDATE:好的,我忘了提到的另一件事是传递给AjaxOptions的方法只是Javascript函数,没有参数。参数由处理所有连线的Unobtrusive脚本自动传递。所以你的表格应该是这样的......

OnComplete

它会处理剩下的事情。如果您需要在@using (Ajax.BeginForm( "_MonthRanges", "Projects", new { id = ViewBag.InputResourceID }, new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "MonthRanges", InsertionMode = InsertionMode.Replace, OnComplete = "myJSFunction" })) 函数中传递其他参数,则可能需要通过其他方式公开它们。作为javascript变量或通过将其与其他元素相关联并使用myJSFunction访问它(这是我首选和建议的方法)。对不显眼的ajax JavaScript库进行的常见请求修改之一(我希望Microsoft只是采用这种更改并完成它)是将$("elementselector").data("dataAttributeName")的上下文设置为触发ajax事件的元素。因此,在这种情况下,它会使this等于表单元素。考虑到这一切,这是我的建议。

第一: 修改您的Unobtrusive Ajax脚本文件,以便将source元素分配给this关键字,以便在JavaScript处理不引人注意的事件时可以使用它。 This question outlines what it involves(一行添加到文件中)

第二的 将您的字符串添加到表单

中的一个数据属性
this

第三的 从处理事件的javascript函数内部访问您的参数。

@using (Ajax.BeginForm(
    "_MonthRanges",
    "Projects",
    new {id = ViewBag.InputResourceID},
    new AjaxOptions
        {
            HttpMethod = "POST",
            UpdateTargetId = "MonthRanges",
            InsertionMode = InsertionMode.Replace,

            OnComplete = "myJSFunction"
        },
    new { data_parameter_name = "myString" }))