You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AJAX提交后如何重新加载Telephone的Create视图?

在Telephone创建视图中新增TelephoneModel后刷新可选列表的解决方案

我有两个模型类:Telephone(对应代码中的Telefono)和TelephoneModel(对应ModeloTelefono)。创建新Telephone时必须选择一个TelephoneModel。我在Telephone的Create视图中添加了一个Modal,无需离开当前视图即可创建TelephoneModel。

已经在TelephoneController中添加了一个函数,接收Modal的数据并将TelephoneModel存入数据库,该函数通过Create视图中的Ajax调用。目前已成功将TelephoneModel添加到数据库,但当前视图并未刷新,新的可选信息无法显示。

请问在数据库中创建TelephoneModel后,如何重新加载视图以显示新的可选信息?


模型代码

namespace WebApplication1.Models
{
    public class Telefono
    {
        [Key]
        public int ID { get; set; }
        public required string Nombre { get; set; }
        public int IpId { get; set; }
        public virtual Ip? Ip { get; set; }
        public int ModeloTelefonoId { get; set; }
        public ModeloTelefono? ModeloTelefono { get; set; }

    }

   public class ModeloTelefono
   {

       public int ID { get; set; }
       public required string Nombre { get; set; }
       public required int MarcaID { get; set; } // 必填外键属性
       public Marca? Marca { get; set; } // 关联到主表的导航属性
   }

}

控制器函数(原代码)

public async Task<IActionResult> AddModelo(string Modelo, int MarcaID, string Nombre, int subredID, int ipID)
    {
        var newModelo = new ModeloTelefono
        {
            Nombre = Modelo,
            MarcaID = MarcaID
        };

        if (newModelo != null)
        {
            _context.Add(newModelo);
            await _context.SaveChangesAsync();

            ViewBag.SubReds = _context.SubRed.ToList();
            ViewData["IpId"] = new SelectList(_context.Ip, "ID", "IpValue", ipID);
            ViewData["SubRedes"] = new SelectList(_context.SubRed, "ID", "Nombre", subredID);
            ViewData["ModeloTelefonoId"] = new SelectList(_context.ModeloTelefono, "ID", "Nombre", newModelo.ID);
            ViewData["Marcas"] = new SelectList(_context.Marca, "ID", "Nombre");


                            
            return View("Create", new Telefono { Nombre = Nombre });
            
        }
        else { return View(); }

    }

Ajax函数(原代码)

function agregarModelo() {

        const Modelo = document.querySelector("#modeloInput").value
        const MarcaID = document.querySelector("#marcaSelect").value;
        const Nombre = document.querySelector("#Nombre").value;
        const subredID = document.querySelector("#Ip_SubRedID").value;
        const ipID = document.querySelector("#ipDropdown").value;


        $.ajax({
            url: '/Telefonoes/AddModelo',
            type: 'POST',
            dataType: 'JSON',
            data: { Modelo: Modelo, MarcaID: MarcaID, Nombre: Nombre, subredID: subredID, ipID: ipID }              
        });

    }

解决方案

1. 调整控制器,返回必要数据而非整个视图

原控制器返回整个Create视图,既不符合Ajax期望的JSON格式,也没必要传输整个页面。修改后只返回新创建的ModeloTelefono的核心数据:

public async Task<IActionResult> AddModelo(string Modelo, int MarcaID)
{
    var newModelo = new ModeloTelefono
    {
        Nombre = Modelo,
        MarcaID = MarcaID
    };

    if (!string.IsNullOrEmpty(Modelo) && MarcaID > 0)
    {
        _context.Add(newModelo);
        await _context.SaveChangesAsync();
        // 返回新模型的ID和名称,用于前端更新下拉列表
        return Json(new { Id = newModelo.ID, Nombre = newModelo.Nombre });
    }
    else 
    {
        return Json(new { success = false, message = "请填写完整的模型信息" });
    }
}

2. 修改Ajax函数,动态更新下拉列表

在Ajax的成功回调里,直接操作DOM把新选项添加到ModeloTelefonoId下拉列表中,同时处理Modal关闭和输入框清空:

function agregarModelo() {
    const Modelo = document.querySelector("#modeloInput").value.trim();
    const MarcaID = document.querySelector("#marcaSelect").value;

    // 前端先做简单参数校验
    if (!Modelo || MarcaID <= 0) {
        alert("请填写完整的模型信息");
        return;
    }

    $.ajax({
        url: '/Telefonoes/AddModelo',
        type: 'POST',
        dataType: 'JSON',
        data: { Modelo: Modelo, MarcaID: MarcaID },
        success: function(response) {
            if (response.Id) {
                // 获取目标下拉列表元素
                const modeloSelect = document.querySelector("#ModeloTelefonoId");
                
                // 创建新选项并设置为选中状态
                const newOption = document.createElement("option");
                newOption.value = response.Id;
                newOption.textContent = response.Nombre;
                newOption.selected = true;

                // 将新选项添加到下拉列表
                modeloSelect.appendChild(newOption);

                // 关闭Modal(假设你的Modal ID是modeloModal)
                $('#modeloModal').modal('hide');
                // 清空输入框
                document.querySelector("#modeloInput").value = "";
            } else {
                alert(response.message || "创建模型失败");
            }
        },
        error: function() {
            alert("请求失败,请检查网络或重试");
        }
    });
}

3. 关键优化说明

  • 减少冗余参数:Ajax只传递创建ModeloTelefono必需的参数,无需携带Telephone的其他信息
  • 局部更新页面:不用刷新整个视图,仅更新需要变化的下拉列表,提升用户体验
  • 增加参数校验:前后端都做简单校验,避免无效请求

内容的提问来源于stack exchange,提问作者Joel Delgado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:04:55