Asp.net mvc ajax响应中不包括脚本块
在我的应用程序中,我对所有视图都有一个通用的布局,从一个视图(Index.cshtml)中,我使用Asp.net mvc ajax响应中不包括脚本块,asp.net-mvc,asp.net-ajax,Asp.net Mvc,Asp.net Ajax,在我的应用程序中,我对所有视图都有一个通用的布局,从一个视图(Index.cshtml)中,我使用Ajax.BeginForm显示另一个视图作为响应,代码如下 @使用(Ajax.BeginForm(“编辑”、“主页”、新的AjaxOptions{UpdateTargetId=“content”,InsertionMode=InsertionMode.Replace})) 现在我的问题是,作为响应,edit视图按预期呈现,但edit视图中包含的脚本块不包括在内,因此不会执行javascript @
Ajax.BeginForm
显示另一个视图作为响应,代码如下
@使用(Ajax.BeginForm(“编辑”、“主页”、新的AjaxOptions{UpdateTargetId=“content”,InsertionMode=InsertionMode.Replace}))
现在我的问题是,作为响应,edit视图按预期呈现,但edit视图中包含的脚本块不包括在内,因此不会执行javascript
@model Test.Models.CARE
@{
ViewBag.Title=“编辑”
}
函数s(){
警报(“hi”);
}
编辑
@使用(Html.BeginForm(“保存以供确认”、“主页”)
{
Plz帮助。将javascript代码放在视图中是不好的做法,更不用说部分视图了。因此,我建议您将此javascript代码外部化到单独javascript文件中的单独函数中 然后您可以订阅Ajax.BeginForm助手的
OnSuccess
事件:
@using (Ajax.BeginForm("Edit", "Home", new AjaxOptions { OnSuccess = "editSuccess", UpdateTargetId = "content", InsertionMode = InsertionMode.Replace }))
{
...
}
然后在单独的javascript文件中定义editSuccess
函数:
function editSuccess(result) {
alert('hi');
}
现在在部分视图中,您应该只保留部分标记中应该保留的内容。去掉任何
标记,您不需要它们。您不需要任何内联脚本。它们只会增加网页的大小,浪费带宽,因为浏览器无法缓存它们:
@model Test.Models.CARE
<h2 style="padding: 0px; margin-top: 0px;">Edit</h2>
@using (Html.BeginForm("SaveForConfirmation", "Home"))
{
...
}
注意我是如何定义的
OnSuccess=“s”
其中s
是您在部分视图中定义的函数,在本例中将调用该函数。但我再次重申,这是一种错误的方法,只有在您没有时间正确重构代码的情况下才应使用。将javascript代码放入视图中是一种不好的做法,更不用说部分视图了。因此,我要重新考虑我建议您在单独的javascript文件中的单独函数中具体化此javascript代码
然后您可以订阅Ajax.BeginForm助手的OnSuccess
事件:
@using (Ajax.BeginForm("Edit", "Home", new AjaxOptions { OnSuccess = "editSuccess", UpdateTargetId = "content", InsertionMode = InsertionMode.Replace }))
{
...
}
然后在单独的javascript文件中定义editSuccess
函数:
function editSuccess(result) {
alert('hi');
}
现在在部分视图中,您应该只保留部分标记中应该保留的内容。去掉任何
标记,您不需要它们。您不需要任何内联脚本。它们只会增加网页的大小,浪费带宽,因为浏览器无法缓存它们:
@model Test.Models.CARE
<h2 style="padding: 0px; margin-top: 0px;">Edit</h2>
@using (Html.BeginForm("SaveForConfirmation", "Home"))
{
...
}
注意我是如何定义的
OnSuccess=“s”
其中s
是您在部分中定义的函数,在本例中将调用该函数。但我再次重申,这是一种错误的方法,只有在您没有时间正确重构代码时才应使用。最终实现了所需的功能
我就是这样做的
视图(从拨打电话的位置)
该视图称为局部视图
@model TestApp.Models.CUSTOMER
@{
ViewBag.Title = "Edit";
}
<script>
function s() {
var readonly="@TempData["readonly"].ToString()";
if(readonly=="readonly")
{
$('input[type="text"],select').attr('readonly','readonly');
$("#Save").remove();
}
}
</script>
<h2 style="padding: 0px; margin-top: 0px;">
Edit</h2>
@using (Html.BeginForm("Save", "Home"))
{
@Html.ValidationSummary()
<fieldset>
<legend>CUSTOMER</legend>
<table style="margin: 0px auto;">
<tr>
<td>
在进一步查找firebug时,我可以看到响应包含脚本
<script>
function s() {
var readonly="readonly";var s="hi"+ prompt("sdfs","kakaji");
alert(s );
if(readonly=="readonly")
{
$('input[type="text"],select').attr('readonly','readonly');
$("#Save").remove();
}
}
</script>
<form action="/Grid/Save" method="post"><div class="validation-summary-valid" data-valmsg-summary="true">
<ul><li style="display:none"></li></ul>
</div>
<fieldset>
<legend>CUSTOMER</legend>
<table style="margin: 0px auto;">
<tr>
<td>
<div class="editor-label">
函数s(){
var readonly=“readonly”;var s=“hi”+提示(“sdfs”、“kakaji”);
警报;
如果(只读==“只读”)
{
$('input[type=“text”],select').attr('readonly','readonly');
$(“#保存”).remove();
}
}
顾客
但是,我发现生成的页面没有包含我找到原因的脚本
因此,这解决了我的问题,并为我提供了一个原因,即为什么我无法从Ajax响应中看到或查看脚本标记。最终实现了所需的功能 我就是这样做的 视图(从拨打电话的位置) 该视图称为局部视图
@model TestApp.Models.CUSTOMER
@{
ViewBag.Title = "Edit";
}
<script>
function s() {
var readonly="@TempData["readonly"].ToString()";
if(readonly=="readonly")
{
$('input[type="text"],select').attr('readonly','readonly');
$("#Save").remove();
}
}
</script>
<h2 style="padding: 0px; margin-top: 0px;">
Edit</h2>
@using (Html.BeginForm("Save", "Home"))
{
@Html.ValidationSummary()
<fieldset>
<legend>CUSTOMER</legend>
<table style="margin: 0px auto;">
<tr>
<td>
在进一步查找firebug时,我可以看到响应包含脚本
<script>
function s() {
var readonly="readonly";var s="hi"+ prompt("sdfs","kakaji");
alert(s );
if(readonly=="readonly")
{
$('input[type="text"],select').attr('readonly','readonly');
$("#Save").remove();
}
}
</script>
<form action="/Grid/Save" method="post"><div class="validation-summary-valid" data-valmsg-summary="true">
<ul><li style="display:none"></li></ul>
</div>
<fieldset>
<legend>CUSTOMER</legend>
<table style="margin: 0px auto;">
<tr>
<td>
<div class="editor-label">
函数s(){
var readonly=“readonly”;var s=“hi”+提示(“sdfs”、“kakaji”);
警报;
如果(只读==“只读”)
{
$('input[type=“text”],select').attr('readonly','readonly');
$(“#保存”).remove();
}
}
顾客
但是,我发现生成的页面没有包含我找到原因的脚本
因此,这解决了我的问题,并为我提供了一个原因,即为什么我无法从Ajax响应中看到或观看我的脚本标记。dear@Darin我知道您的解决方案,但我的问题是,我想调用的javascript方法出于某种原因使用viewbag,因此只能在运行时定义,否则将无法正常运行例如,函数test(){var readonly=@Viewbag.readonly;if(readonly){/*一些代码*/}else{/*一些其他代码*/}此外,ViewBag的这个值是在Ajax调用的控制器方法中设置的,因此在执行该方法之前无法定义。我理解。在这种情况下,您可以调用您的分部中定义的
s
函数。请参阅我的更新答案。尽管脚本块是在分部视图中定义的,但问题确实存在它不包括在ajax响应中(当我使用Html.Beginform时,它也包括在内)是的,在视图中包含javascript是一种非常糟糕的做法。它会使您的视图变得越来越大,并且您的javascript不再能够从web浏览器的自动缓存中受益。我同意10个视图中有9个视图是特定于javascript的,但这根本不是将其放在视图中的理由。此javascript应该放在单独的javasc中ipt文件。如果您将其放在视图中,则表示您做错了。亲爱的@Darin我知道您的解决方案,但我的问题