2012-09-24 33 views
1

在我的應用程序中,我有一個所有視圖的公共佈局,從一個視圖(Index.cshtml)我已經使用Ajax.BeginForm來顯示另一個視圖作爲響應代碼爲腳本塊不包括在ajax響應中

@using (Ajax.BeginForm("Edit", "Home", new AjaxOptions { UpdateTargetId = "content",InsertionMode=InsertionMode.Replace }))

我現在的問題是預期編輯視圖呈現的迴應,但在編輯視圖中的腳本塊不包括在內,因此不執行的JavaScript。

@model Test.Models.CARE
@{
ViewBag.Title = "Edit";
}
<script>
function s() {
alert("hi");
}
</script>
<h2 style="padding: 0px; margin-top: 0px;"> Edit</h2>
@using (Html.BeginForm("SaveForConfirmation", "Home"))
{

Plz help。

回答

4

把javascript代碼放在視圖中是不好的做法,更不用說部分視圖了。所以我建議你在一個獨立的javascript文件中將這個javascript代碼放在一個單獨的函數中。

然後你可以訂閱OnSuccess事件Ajax.BeginForm幫手:

@using (Ajax.BeginForm("Edit", "Home", new AjaxOptions { OnSuccess = "editSuccess", UpdateTargetId = "content", InsertionMode = InsertionMode.Replace })) 
{ 
    ...  
} 

,然後在單獨定義editSuccess功能的JavaScript文件:

function editSuccess(result) { 
    alert('hi'); 
} 

現在你的部分觀點你應該只保留部分標記中的內容。擺脫任何<script>標籤,你不需要它們。你不需要任何內聯腳本。它們只會增加網頁的大小和浪費帶寬,因爲它們不能被瀏覽器緩存。

@model Test.Models.CARE 
<h2 style="padding: 0px; margin-top: 0px;">Edit</h2> 
@using (Html.BeginForm("SaveForConfirmation", "Home")) 
{ 
    ... 
} 

UPDATE:

如果你有一些寫得不好的JavaScript取決於垃圾一樣ViewBag內的部分,那麼你可以從的onSuccess回調中調用相應的功能:

@using (Ajax.BeginForm("Edit", "Home", new AjaxOptions { OnSuccess = "s", UpdateTargetId = "content", InsertionMode = InsertionMode.Replace })) 
{ 
    ...  
} 

請注意我如何定義OnSuccess = "s"其中s是您在部分中定義的函數,並且將調用哪個函數 在這種情況下。但我再一次重申,這是一種錯誤的方法,只有在沒有時間適當地重構代碼時才能使用。

+0

親愛的@Darin我知道你的解決方案,但我的問題是,我想調用的JavaScript方法使用viewbag出於某種原因,因此只能在運行時定義其他將不正確函數例如function test(){var readonly = @ Viewbag.Readonly; if(readonly){/ * some code * /} else {/ * some other code * /}} –

+0

此外,ViewBag的這個值在Ajax調用的控制器方法中設置,因此在方法之前無法定義執行 –

+0

我明白了。那麼,在這種情況下,你可以調用你的partial中定義的's'函數。看到我更新的答案。 –

0

最後達到了所需的功能。

這是怎樣我都做到了

視圖(從進行呼叫在哪裏)

<input type="submit" value="Create" /> 
@using (Ajax.BeginForm("Edit", "Home", new AjaxOptions {OnSuccess="DisableControls()", 
InsertionMode= InsertionMode.Replace,UpdateTargetId="DivToUpdate" })) 

的控制器

[HttpPost] 
    public ActionResult Edit(FormCollection fc) 
    { 
     if (fc.Keys[0].ToString().TrimEnd() == "Display") 
     { 
      TempData["readonly"] = "readonly"; 
     } 
     else 
      TempData["readonly"] = ""; 

被叫局部視圖

@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> 

現在在診斷在前面的失敗嘗試的原因中,我在腳本中編寫了一個alert()以查看腳本是否正在執行。

<script> 
    function s() { 
     var readonly="@TempData["readonly"].ToString()";var s="hi"+ prompt("name",""); 
     alert(s); 
     if(readonly=="readonly") 
      { //To make all text boxes and dropdown readonly 
      $('input[type="text"],select').attr('readonly','readonly');   
      $("#Save").remove();//To Remove the save button 
      } 
     } 
</script> 

進一步查找與螢火蟲,我可以看到,響應包含腳本

<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"> 

但是發現生成的頁面不包括我找了個理由腳本here

因此,這解決了我的問題,並給了我一個原因背後的原因是爲什麼我無法看到或觀看來自Ajax響應的腳本標記。