如何使用 jquery 或 ajax 在 c#/asp.net 中为 MVC 项目更新 razor 部分视图

Posted

技术标签:

【中文标题】如何使用 jquery 或 ajax 在 c#/asp.net 中为 MVC 项目更新 razor 部分视图【英文标题】:How to use jquery or ajax to update razor partial view in c#/asp.net for a MVC project 【发布时间】:2013-10-23 21:44:49 【问题描述】:

在 MVC 部分视图文件中,我构建了一个 html.TextBox 和两个提交按钮。这两个按钮将在单击后增加/减少 Html.TextBox 值。 Html.TextBox 显示的值会相应改变。但是,一旦我需要在单击后根据新值更新#refTable div。页面或部分从未更新。代码如下,其中添加了一些 cmets 用于解释目的。感谢您的帮助。

//******* cshtml文件** ********//

<body>
</body>

<input type="submit" value="PrevY" name="chgYr2" id="pY" />
@
    var tempItem3 = Model.First(); // just give the first entry from a database, works.
    if (ViewData["curSel"] == null)
    
    @Html.TextBox("yearSelect3", Convert.ToDateTime(tempItem3.Holiday_date).Year.ToString());  
    ViewBag.selYear = Convert.ToDateTime(tempItem3.Holiday_date).Year; // just initial value, works
    ViewData["curSel"] = Convert.ToDateTime(tempItem3.Holiday_date).Year;
    
    else
    
    @Html.TextBox("yearSelect3", ViewData["curSel"].ToString());
     

<input type="submit" value="NextY" name="chgYr2" id="nY" />


<script type="text/javascript">
    $(document).ready(function () 
        $(document).on("click", "#nY", function () 
            var val = $('#yearSelect3').val();
            $('#yearSelect3').val((val * 1) + 1);
            var dataToSend = 
                id: ((val * 1) + 1)
            
            // add some jquery or ajax codes to update the #refTable div
            // also ViewBag.selYear need to be updated as ((val * 1) + 1)
            // like:   ViewBag.selYear = ((val * 1) + 1);
            // any similar temp variable is fine
        );

        );
        $(document).on("click", "#pY", function () 
            var val = $('#yearSelect3').val();
            $('#yearSelect3').val((val * 1) - 1);
            var dataToSend = 
                id: ((val * 1) - 1)
            

        );
    );
</script>



<span style="float: right"><a href="/">Set Holiday Calender for 2013</a></span>
<span id="btnAddHoliday">@Html.ActionLink("Add Holiday", "Create", null, new  id = "addHilBtn" )</span>

<div id="refTable">
    <table class="tblHoliday" style="width: 100%;">
            <th>
                Holiday
            </th>
            <th>
                Dates
            </th>
            <th>Modify</th>
            <th>Delete</th>
        </tr>

        @foreach (var item in Model)
        

            if (    Convert.ToDateTime(item.Holiday_date).Year == ViewBag.selYear)
            // if the ViewBag.selYear is hard code, this selection "works"
            
            <tr>                
                <td>
                    @Html.DisplayFor(modelItem => item.Holiday_Name)
                </td>               
                <td>
                    @item.Holiday_date.Value.ToString("MM/dd/yyyy")
                </td>
                <td>
                    @Html.ActionLink("Edit", "Edit", new   )
                </td>
                <td>
                    @Html.ActionLink("Delete", "Delete", new   )
                </td>
            </tr>
            
        

    </table>
</div>

【问题讨论】:

你试过的AJAX代码在哪里? 我把 ajax 拿出来了,因为这些 ajax 是用来调用 MVC 动作的。我试图通过执行 MVC 操作来刷新网页,但徒劳无功。 【参考方案1】:

如果您想更新页面的一部分而不重新加载整个页面,则需要 AJAX。

主 cshtml 视图

<div id="refTable">
     <!-- partial view content will be inserted here -->
</div>

@Html.TextBox("yearSelect3", Convert.ToDateTime(tempItem3.Holiday_date).Year.ToString());
<button id="pY">PrevY</button>

<script>
    $(document).ready(function() 
        $("#pY").on("click", function() 
            var val = $('#yearSelect3').val();
            $.ajax(
                url: "/Holiday/Calendar",
                type: "GET",
                data:  year: ((val * 1) + 1) 
            )
            .done(function(partialViewResult) 
                $("#refTable").html(partialViewResult);
            );
        );
    );
</script>

您需要添加我省略的字段。我使用了&lt;button&gt; 而不是提交按钮,因为您没有表单(我在您的标记中没有看到),您只需要它们在客户端触发 javascript。

HolidayPartialView 被渲染成 html,jquery done 回调将该 html 片段插入到 refTable div 中。

HolidayController 更新操作

[HttpGet]
public ActionResult Calendar(int year)

    var dates = new List<DateTime>()  /* values based on year */ ;
    HolidayViewModel model = new HolidayViewModel 
        Dates = dates
    ;
    return PartialView("HolidayPartialView", model);

此控制器操作采用 year 参数并使用强类型视图模型而不是 ViewBag 返回日期列表。

查看模型

public class HolidayViewModel

    IEnumerable<DateTime> Dates  get; set; 

HolidayPartialView.csthml

@model Your.Namespace.HolidayViewModel;

<table class="tblHoliday">
    @foreach(var date in Model.Dates)
    
        <tr><td>@date.ToString("MM/dd/yyyy")</td></tr>
    
</table>

这是插入到您的 div 中的内容。

【讨论】:

好的,我喜欢你的解决方案,但为什么要使用 done?为什么不直接使用ajax的成功回调? Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete() callbacks are deprecated as of jQuery 1.8. To prepare your code for their eventual removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead. jQuery.ajax() 您好豪尔赫,非常感谢您的帮助。欣赏!!关于“ajax回调”的使用。抱歉,我还是 ajax 和 MVC 的新手,需要一些时间来消化它们。 .done(function(partialViewResult) $("#refTable").html(partialViewResult); );详细解释上面的代码块。【参考方案2】:

部分视图的主要概念是返回 HTML 代码,而不是返回到它自己的部分视图。

[HttpGet]
public ActionResult Calendar(int year)

    var dates = new List<DateTime>()  /* values based on year */ ;
    HolidayViewModel model = new HolidayViewModel 
        Dates = dates
    ;
    return PartialView("HolidayPartialView", model);

此操作返回部分视图的 HTML 代码(“HolidayPartialView”)。

要刷新部分视图,请使用下面的 jQuery 将现有项目替换为新过滤的项目。

$.ajax(
                url: "/Holiday/Calendar",
                type: "GET",
                data:  year: ((val * 1) + 1) 
            )
            .done(function(partialViewResult) 
                $("#refTable").html(partialViewResult);
            );

【讨论】:

【参考方案3】:

您也可以像这样使用 Url.Action 作为路径:

$.ajax(
        url: "@Url.Action("Holiday", "Calendar", new  area = "", year= (val * 1) + 1 )",                
        type: "GET",           
        success: function (partialViewResult)             
            $("#refTable").html(partialViewResult);
        
    );

【讨论】:

以上是关于如何使用 jquery 或 ajax 在 c#/asp.net 中为 MVC 项目更新 razor 部分视图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 $.ajax(jQuery 或 Zepto)发布对象数组

jQuery - 如何在 Ajax 表单提交中添加“或”

如何使用 jquery 或 ajax 获取外部 html 页面内容 [重复]

html标签在点击时使用jquery和ajax向上或向下传输[关闭]

使用 JSONP 时如何捕获 jQuery $.getJSON(或数据类型设置为“jsonp”的 $.ajax)错误?

使用 jQuery 或 Ajax 显示或隐藏字段 [关闭]