我在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
}))
有什么建议吗?
答案 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" }))