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

ASP.NET客户端能否创建C#对象?无法添加地址至字典求助

问题分析与解决方案

首先明确:没法直接在客户端创建C#对象。C#是服务器端语言,运行在服务器环境;客户端浏览器仅能执行JavaScript,两者完全分离——页面渲染完成后,服务器端代码就已执行完毕,客户端操作无法触发服务器端代码的实时运行。

你的代码核心问题是把服务器端C#代码(@direcciones.Add(...))直接写入了客户端的点击事件中:这段C#代码在页面加载时就会执行,不会等你点击按钮才运行;而且客户端的JS变量(比如_iDdireccion)服务器端根本无法访问,因为服务器渲染页面时这些JS变量还未生成。

正确的做法是:在客户端用JavaScript存储地址数据,提交表单时再将数据传给服务器,由服务器端转换为C#对象。


客户端实现(JS存储地址)

用JS对象模拟字典结构,在客户端暂存地址数据:

@model Cliente
<html lang="es">
<head>
    <!-- 引入jQuery -->
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
</head>
<body>
    <!-- 地址输入表单(示例结构) -->
    <input type="text" id="inputTipoVia" placeholder="Tipo de vía">
    <input type="text" id="inputNombreVia" placeholder="Nombre de vía">
    <!-- 其他输入框省略 -->
    <button id="botonAceptarDirec">添加地址</button>
    <button id="submitForm">提交账户</button>
    <!-- 用于传递地址数据的隐藏域 -->
    <input type="hidden" id="direccionesHidden" name="direccionesJson">

    <script>
        // 客户端用JS对象模拟字典存储地址
        let direcciones = {};

        $('#botonAceptarDirec').click(function () {
            console.log('estamos en evento click boton aceptar direccion...');
            // 获取所有输入框值
            let _tipoVia = $('#inputTipoVia').val();
            let _nombreVia = $('#inputNombreVia').val();
            let _numeroVia = $('#inputNumVia').val();
            let _piso = $('#inputPiso').val();
            let _puerta = $('#inputPuerta').val();
            let _bloque = $('#inputBloque').val();
            let _escalera = $('#inputEscalera').val();
            let _urbanizacion = $('#inputUrbanizacion').val();
            let _observaciones = $('#inputObservaciones').val();
            let _codPro = $('#inputProvincia').val();
            let _codMun = $('#inputLocalidad').val();
            let _cp = $('#inputCP').val();
            let _esPrincipal = $('#inputEsPrincipal').val();
            // 用JS生成唯一ID替代C#的Guid
            let _iDdireccion = self.crypto.randomUUID();

            // 创建JS地址对象并添加到字典
            direcciones[_iDdireccion] = {
                TipoVia: _tipoVia,
                NombreVia: _nombreVia,
                NumeroVia: _numeroVia,
                Piso: _piso,
                Puerta: _puerta,
                Bloque: _bloque,
                Escalera: _escalera,
                Urbanizacion: _urbanizacion,
                Observaciones: _observaciones,
                CodPro: _codPro,
                CodMun: _codMun,
                CP: _cp,
                EsPrincipal: _esPrincipal
            };

            // 打印当前存储的地址列表
            console.log(direcciones);
        });

        // 提交表单时传递地址数据
        $('#submitForm').click(function () {
            // 将JS对象转为JSON字符串
            let direccionesJson = JSON.stringify(direcciones);
            // 存入隐藏域,随表单一起提交
            $('#direccionesHidden').val(direccionesJson);
            // 提交表单
            $('form').submit();
        });
    </script>
</body>
</html>

服务器端处理(转换为C#对象)

在控制器中接收JSON数据,反序列化为C#的Dictionary<string, Direccion>:

using System.Text.Json;

[HttpPost]
public IActionResult CreateCliente(Cliente cliente, string direccionesJson)
{
    // 将JSON字符串反序列化为C#字典
    var direcciones = JsonSerializer.Deserialize<Dictionary<string, Direccion>>(direccionesJson);
    
    // 将地址关联到客户端对象
    cliente.Direcciones = direcciones;
    // 执行保存到数据库等后续操作
    
    return RedirectToAction("Index");
}

如果使用AJAX提交,可直接将JSON作为请求体发送,无需隐藏域,流程会更简洁。

总结:客户端用JS管理地址数据,提交时转为JSON传递给服务器,服务器再反序列化为C#对象——这是前后端交互的标准流程,无法跳过直接在客户端生成C#对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:13:17