Skip to main content
 首页 » 编程设计

C# MVC4 Jquery Ajax 发布部分 View 更新

2024年02月01日31zhwl

我有以下局部 View 。

@using System.Data; 
@using System.Dynamic; 
@using System.Collections.Generic; 
@using System.Linq; 
@model TheMProject.Models.MyViewModel   
 
 <div id="Item_Buttons"> 
      <h2 class="alignleft">Table 1</h2> 
      <p class="alignright">Item Name<input type="text" name="item_name" value="@Html.ValueFor(x => x.itemname)" class="search-query" placeholder="Search" style ="width:100px"/> 
            <button class="btn btn-success" id="Change_Item_Name" value="Change_Item_Name" name="action:Change_Item_Name" type="button"> Change Item Name</button> 
                            Grade<input type="text" name="item_grade" value="@Html.ValueFor(x => x.grade)" class="search-query" placeholder="Search" style="width:100px"/> 
            <button class="btn btn-success" id="ChangeItemGrade" value="ChangeItemGrade" name="action:Change_Grade" type="button">Change Grade</button> 
                            Delete Record<input type="text" name="delete_item" value="@Html.ValueFor(x => x.itemname)" class="search-query" placeholder="Search" style ="width:100px"/> 
            <button class="btn btn-success" id="DeleteItem" value="DeleteItem" name="action:Delete_Item" type="button">Delete Record</button> 
  </p> 
    <div style="clear: both;"></div> 
    </div> 
<section> 
    <div id ="firstgrid"> 
        <table id="TTable" class="gridTable"> 
            <thead class="gridHead"> 
                <tr> 
                    @Html.DisplayFor(x => x.TColumns) 
                </tr> 
            </thead> 
            <tbody> 
                @Html.DisplayFor(x => x.TRows) 
            </tbody> 
        </table> 
        </div> 
</section> 
    <section> 
            <form id="form1"> 
        <div id="grid"> 
            <table id="CTable" class="gridTable"> 
                <thead class="gridHead"> 
                    <tr> 
                        @Html.DisplayFor(x => x.Columns) 
                    </tr> 
                </thead> 
                <tbody> 
                    @Html.DisplayFor(x => x.Rows) 
                </tbody> 
            </table> 
                </div> 
            </form> 
        </section> 
<section> 
    <div id ="Display_Average"> 
        <table id="AvgDisplayTable" class="gridTable"> 
            <thead class="gridHead"> 
                <tr> 
                    @Html.DisplayFor(x => x.AvgColumns) 
                </tr> 
            </thead> 
            <tbody> 
                @Html.DisplayFor(x => x.AvgRows) 
            </tbody> 
        </table> 
        </div> 
</section> 
<button class="btn" id="SubmitAverage" value ="SubmitAverage" name="action:SubmitAverage" type="button">Submit Averages</button> 
 
<div id="ItemNameDiv" title="Change Item Name"> 
    @using (Html.BeginForm("ChangeItemName", "Home", "POST")) 
    { 
        <section> 
            Heat Name:<input type="text" name="itemName" value="@Html.ValueFor(x => x.heatname)" style ="width:100px"/> 
            Change to:<input type="text" name="updatedName" value="" style="width: 100px" /> 
            <input type="button" id="ChangeItemName" name="ChangeItemName" value="Change" /> 
        </section> 
    } 
</div> 
 
<div id="ItemGradeDiv" title="Change Item Grade"> 
    @using (Html.BeginForm("ChangeGrade", "Home", "POST")) 
    { 
        <section> 
            Item Grade:<input type="text" name="grade" value="@Html.ValueFor(x => x.grade)" style ="width:100px"/> 
            Change to:<input type="text" name="updatedName" value="" style="width: 100px" /> 
            <input type ="hidden" name="hiddenItem" value ="@Html.ValueFor(x => x.itemname)" /> 
            <input type="submit" name="ChangeGrade" value="Change" /> 
        </section> 
    } 
</div> 
 
<div id="DeleteItemDiv" title="Delete Item"> 
@using (Html.BeginForm("DeleteItem", "Home", "POST")) 
{ 
    <section> 
        Heat Name:<input type="text" name="itemName" value="@Html.ValueFor(x => x.itemname)" style ="width:100px"/> 
        <input type="submit" name="DeleteItem" value="Delete" /> 
    </section> 
} 
    </div> 

单击“更改项目名称”按钮时,将使用 jquery 调用 ajax 帖子,如下所示:

   $(document).ready(function () { 
        $('#ChangeItemName').click(function (e) { 
            var tdata = $('#form1').serialize(); 
            var origname = $('#ItemNameDiv').find('input[name="itemName"]').first().val(); 
            var newname = $('#ItemNameDiv').find('input[name="updatedName"]').first().val(); 
            $.ajax({ 
                type: "POST", 
                data: { 
                    mCollection: tdata, 
                    itemName: origname, 
                    updatedName: newname 
                }, 
 
                url: "Home/ChangeItemName", 
                success: function (result) { success(result); } 
            }); 
        }); 
 
 
        function success(result) { 
 
            $('#ItemNameDiv').dialog('close'); 
            $("#My_Partial_V").html(result); 
        } 
    }); 

.完成后,部分 View 将使用帖子中的更新数据进行刷新。包括这篇文章所需的 jquery,还有其他脚本需要在 View 中执行其他操作,例如隐藏提交平均按钮下方显示的 div,直到单击其他按钮。在第一次执行前面提到的 ajax post 之后,如果单击同一个按钮,post 将被调用两次而不是一次,第三次单击它会运行 4 次,依此类推。

我试过移动脚本引用

<script src="@Url.Content("~/Scripts/partialitemscripts.js")"  
type="text/javascript"></script> 

在部分 View 之外并进入包含部分的 View 以及布局文件。当我尝试这两种方法时,一切都正确加载,直到部分 View 被刷新,此时所有脚本都无法被调用/引用。

请您参考如下方法:

您可以尝试将脚本移出 Partialview 并移入主视图(如您所说),但稍微改变一下:不是在加载文档时触发函数,而是将其全部放在一个函数中:

function ajaxCallback(result){ 
    $('#ChangeItemName').click(function (e) { 
        var tdata = $('#form1').serialize(); 
        var origname = $('#ItemNameDiv').find('input[name="itemName"]').first().val(); 
        var newname = $('#ItemNameDiv').find('input[name="updatedName"]').first().val(); 
        $.ajax({ 
            type: "POST", 
            data: { 
                mCollection: tdata, 
                itemName: origname, 
                updatedName: newname 
            }, 
 
            url: "Home/ChangeItemName", 
            success: function (result) { success(result); } 
        }); 
    }); 
}     

然后从主视图(包含局部 View )的就绪事件中调用此函数。

要修复您的按钮在完成 ajax 请求后不再工作,您必须更新您的成功函数以调用 ajaxCallback(这将在 partialitemscripts.js 中与ajaxCallback 函数):

function success(result) { 
        $('#ItemNameDiv').dialog('close'); 
        $("#My_Partial_V").html(result); 
        ajaxCallback(); 
    } 

我不确定这是不是理想的解决方案,但我设法通过这种方式获得了类似的效果。