Asp.net mvc ajax响应中不包括脚本块

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 @

在我的应用程序中,我对所有视图都有一个通用的布局,从一个视图(Index.cshtml)中,我使用
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我知道您的解决方案,但我的问题