MVC2 与 JQuery 的 Ajax 实现局部刷新的问题

本文介绍如何使用MVC框架与JQuery Ajax技术实现两个联动的下拉列表。当第一个下拉列表发生变化时,第二个下拉列表会根据第一个的选择实时更新其内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标:两个DropDownList 控件,DDL1,DDL2。实现DDL1 选择后,根据选定值到数据库查询数据,返回并绑定到DDL2。

实现:JQuery中的$.Ajax方法以及MVC中的PartialView控件

具体:

首先MVC视图上的数据,都通过一个数据模型进行格式化存储

namespace ES.DataModels

{
    public class ListSearchModels
    {
        /// <summary>
        /// 客户ID
        /// </summary>        
        public int CustomerID { get; set; }

        /// <summary>
        /// 主叫电话号码
        /// </summary>
        public string PhoneNumber { get; set; }      

        /// <summary>
        /// 客户下拉选择器的 SelectListItem
        /// </summary>
        public List<SelectListItem> CustomerSelectList { get; set; }

        /// <summary>
        /// 电话号码下拉选择器
        /// </summary>
        public List<SelectListItem> PhoneSelectList { get; set; }
    }    
}

在主视图定义以下两个DDL控件,分别是:

客户列表的下拉控件

<%: Html.DropDownListFor(x => x.CustomerID, this.Model.CustomerSelectList, "-请选择公司-")%> 
客户电话号码的下拉控件(PartialView)
<% Html.RenderPartial("GetPhoneNumberList"); %>

并且绑定一个OnChange事件到客户列表

<script language="javascript" type="text/javascript">
         $(document).ready(function () {
             $("#CustomerID").change(function () {
                 GetPhoneNumber('<%=Url.Action("GetPhoneNumberList","Data") %>');
             });
         });
</script>
在这里有个问题,本来是可以直接在 Html.DropDownListFor上进行绑定,如:

<%: Html.DropDownListFor(x => x.CustomerID, this.Model.CustomerSelectList, "-请选择公司-", new { onChange(Parameter)})%>

但因为要将<%=Url.Action("<%=Url.Action("GetPhoneNumberList","Data") %>作为参数传递给JS,而<%=Url.A..%>跟外部的<%: Html.D...%>产生冲突,所以只好用JQuery加载绑定

定义<% Html.RenderPartial("GetPhoneNumberList"); %>这个用户控件的Action:

 

#region GetPhoneNumberList:根据客户下拉框选择项读取该用户号码 | Eason.L / 2011.08.21

        /// <summary>
        /// 根据客户下拉框选择项读取该用户号码
        /// </summary>
        /// <param name="CustomerID"></param>
        /// <returns></returns>
        public PartialViewResult GetPhoneNumberList(string CustomerID)
        {
            // 自定义的数据库操作类
            CustomerDataControl CustomerDataDAL = new CustomerDataControl();
            // 根据客户ID查询该客户的所有电话号码
            List<string> CustomerNumbers = CustomerDataDAL.GetCustomerNumberList(Convert.ToInt32(CustomerID));
            // 新建一个 SelectListItem List 来进行转换
            List<SelectListItem> TempSelectListItem = new List<SelectListItem>();
            ListSearchModels PartialModels = new ListSearchModels();
            if (CustomerNumbers != null)
            {
                PartialModels.PhoneNumber = "PhoneNumberList";
                foreach (var item in CustomerNumbers)
                {
                    TempSelectListItem.Add(new SelectListItem { Value = item.ToString(), Text = item.ToString() });
                }
                PartialModels.PhoneSelectList = TempSelectListItem; // 数据填入页面的数据模型对应的List
            }
            // 返回PartialView
            return PartialView("GetPhoneNumberList", PartialModels);
        }
#endregion

 根据这个Action,生成一个用户控件GetPhoneNumberList.ascx,其实只有一个下拉控件,跟对应字段绑定

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ES.DataModels.ListSearchModels>" %>
<%=Html.DropDownListFor(x=>x.PhoneNumber,this.Model.PhoneSelectList) %>

MVC部分功能完成,接下来用JQuery实现Ajax调用:

function GetPhoneNumber(action) {
    var SelectCustomerID = $("#CustomerID").val();  
    $.ajax({
        url: action,
        type: "POST",
        data: { "CustomerID": SelectCustomerID },
        dataType: "html",
        success: function (data) {
            $("#PhoneNumber").html(data);
        }
    });
}

(这里存在一个问题尚未解决,就是采用$("#PhoneNumber").html(data);  更新页面的时候,IE浏览器是无效的,查了资料,说是IE对这个方法不支持所导致的,但即使改为 document.getElementby("PhoneNumber").innerhtml = data; 这样的JavaScript原生代码也还是不行,如果有解决方案的盆友,请指导一下,谢谢。)

这里要注意的地方是:action 和 dataType  两个参数

action就是要异步调用的页面或MVC中的某个Action,我们是通过<%=Url.Action("&lt;%=Url.Action("GetPhoneNumberList") %>将完整的GetPhoneNumberList这个Action的路径传进来。

dataType使用的是html,否则success部分的回调无法执行。

如果GetPhoneNumberList这个Action用的不是PartialViewResult的类型,而是采用JsonResult类型回传Json数据的话,那么这里的dataType要用"json"

最后,要注意的是,如果返回的 CustomerSelectList 为空的话,程序是会报错的,这里要进行一些相关的处理。其他的……至此,工作完成


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值