我没有从 ASP.NET MVC 中的控制器获取值

Posted

技术标签:

【中文标题】我没有从 ASP.NET MVC 中的控制器获取值【英文标题】:I am not getting values from controller in ASP.NET MVC 【发布时间】:2021-03-05 12:50:01 【问题描述】:

我正在使用 Entity Framework 6.0 在 ASP.NET MVC 5 中编写一个应用程序,该应用程序基于选定的日期,我将此日期发送到控制器,该控制器将其传递给存储过程,此过程基于该日期,计算人数并将值返回给控制器,并且“假定”应该将其传递回 ajax,以便使用 javascript 可以处理它并在视图中显示结果;代码如下:

$("#FechConsult").change('click', function () 
        $.ajax(
            type: 'POST',
            dataType: 'Json',
            url: "/Home/CuentaUser",
            data:  FechaInsc: $("#FechConsult").val() ,
            success: function (data) 
                var CantidadUsr = result[0];
                $("#TotCupos").val(CantidadUsr.CantiPer);
                cupos = ParseInt(CantidadUsr.CantiPer - TotalUsr);
                if ((cupos >= 15) || (cupos <= 20)) 
                    $("#TotCupos").css( "background": "#b5ff33" );
                
                else 
                    if ((cupos >= 10) || (cupos <= 14)) 
                        $("#TotCupos").css( "background": "#e9f00e" );
                    
                    else 
                        if ((cupos >= 1) || (cupos <= 9)) 
                            $("#TotCupos").css( "background": "#e85e0a" );
                            $("#mensaje").show();
                            $("#mensaje").val("Ha Llegado Casi Al Limite de Cupos Diarios");
                        
                        else 
                            if ((cupos = TotalUsr)) 
                                $("#mensaje").show();
                                $("#mensaje").val("Ha Llegado A Límite Máximo de Personas, Seleccione Otro Dia");
                                $("#PassWord").focus();
                            
                        
                    
                
            
        )
    );

那么控制器就会发生这种情况:

[HttpPost]
    public ActionResult CuentaUser(Inscripcion inscripcion)
        
            using (CtaUsr = new Drillco_InscripcionEntities())
            
                var CantiPer =  CtaUsr.SP_Sel_Cta_PersXFecha(Convert.ToString(inscripcion.FechaInsc));
                return Json(CantiPer, JsonRequestBehavior.AllowGet);
            
        

存储过程如下:

ALTER procedure [dbo].[SP_Sel_Cta_PersXFecha]
    @FechInsc varchar(10)
AS
BEGIN
    SELECT COUNT(idOper) AS CantP
    FROM Inscripcion
    WHERE FechaInsc = CONVERT(datetime, @FechInsc, 103)
END

问题:是调用存储过程后,ajax没有收到控制器返回的值,我在浏览器中按F12,提示500错误,不识别名字控制器,我已经转了一千圈了,我还没有找到任何解决方案,有人能告诉我我做错了吗?

【问题讨论】:

旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀! 【参考方案1】:

有一件事,您的 ajax 调用传递了FechaInsc: $("#FechConsult").val(),但您的存储过程需要一个名为“inscripcion”的参数。这些名称和类型应该匹配。从看起来你的 Ajax 调用正在为一个对象的更新“铭文”发送一个字符串,但服务器端代码期待一个实体返回。

应该更像是:

public ActionResult CuentaUser(string fechaInsc)

    using (CtaUsr = new Drillco_InscripcionEntities())
    
        var CantiPer =  CtaUsr.SP_Sel_Cta_PersXFecha(fechaInsc);
        return Json(CantiPer, JsonRequestBehavior.AllowGet);
    

但是,如果该存储过程正在更新特定记录上的值,我看不出它如何知道要更新哪一行。通常对于 Update 方法,您会传递足够的数据来识别要更新的行和值:

public ActionResult CuentaUser(int inscriptionId, string fechaInsc)

或包含要更新的 ID 和数据的数据容器(POCO ViewModel 或 DTO,不是实体)。

值得注意的是,使用实体框架的全部意义在于替换与数据层对话的问题。定义实体,配置 EF 以将这些关系映射到相应的表,并让 EF 管理 SQL 语句的生成和执行。如果打算编写存储过程来处理更新和选择,那么最好只使用 ADO.Net。

使用 EF,更新方法看起来更像:

public ActionResult CuentaUser(int inscripcionId, string fechaInsc)

    using (context = new DrillcoDbContext())
    
        var inscripcion = context.Inscripcions.Single(x => x.InscripcionId == inscripcionId);
        inscripcion.FechaInsc = fechaInsc;
        context.SaveChanges();
        return Json(inscripcion, JsonRequestBehavior.AllowGet);
    

这是对您的应用程序将使用的对象的大量猜测。然而,根本区别在于将要更新的实体的 ID 与更新的值一起传递,使用 DbContext 按 ID 获取该实体,更新值,然后在 DbContext 上调用 SaveChanges . EF 为已更改的值构建所需的 SQL,if 并且仅当这些值实际更改时。无需编写/调用存储过程。

【讨论】:

以上是关于我没有从 ASP.NET MVC 中的控制器获取值的主要内容,如果未能解决你的问题,请参考以下文章

无法在 ASP.NET MVC 5 中从视图到控制器获取 Select2 标记值

如何访问 html5 本地存储 asp.net mvc 3 控制器/管道

显示从 ASP.NET MVC 中的命令行进程获取的数据

将复选框的值传递给 asp.net mvc4 中的控制器操作

asp.net mvc 中模型验证如何处理数组呢?

如何使用 Asp.net MVC Razor 将隐藏字段值从一个控制器传递到另一个控制器