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



我正在使用实体框架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个错误,它无法识别控制器的名称,我已经转了一千圈,我还没有找到任何解决方案,有人能告诉我我做错了吗?

有一件事,您的ajax调用正在传递FechaInsc: $("#FechConsult").val(),但您的存储过程需要一个名为"incitipcion"的参数。这些名称&类型应该匹配。从外观上看,您的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。不需要写入/调用存储过程。

最新更新