0

我正在尝试使用 jQuery 在 MVC4 应用程序中调用操作方法。我正在使用fancybox中显示的编辑表单上的按钮:

<input type="button" value="Approve" id="Approve" />

$.post在这个按钮上使用 jquery 点击

$("#Approve").click(function () {
    debugger;
    var ID = $("#AjaxGrid tbody tr:first").attr("data-pkey");
    debugger;
    var postParams = { Id: ID }
    $.post('@Html.Raw(Url.Action("Approve"))', postParams)
        .fail(function () {
            alert("error occured while Approving");
        }); 
});

在控制器中,以下是我的操作方法:

[HttpPost]
public ActionResult Approve(long id)
{
    Evaluation evaluation = db.EvaluationRepository.GetByID(id);
    evaluation.EvaluationStatusID = Convert.ToInt32(EvaluationStatusType.Approved);
    return PartialView(evaluation);
}

但我总是得到相同的结果,即error occured while Approving

谁能帮我找出问题所在?

在浏览器上使用 F12 出现此错误

Failed to load resource: the server responded with a status of 500 (Internal Server Error) 

还有这个烦人的细节

“/”应用程序中的服务器错误。

参数字典包含“CubicHRMWeb.Areas.Employees.Controllers.EvaluationController”中方法“System.Web.Mvc.ActionResult Approve(Int64)”的不可为空类型“System.Int64”的参数“id”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:参数字典包含“CubicHRMWeb.Areas”中方法“System.Web.Mvc.ActionResult Approve(Int64)”的不可为空类型“System.Int64”的参数“id”的空条目。员工.控制器.评估控制器'。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[ArgumentException:参数字典包含“CubicHRMWeb.Areas.Employees.Controllers”中方法“System.Web.Mvc.ActionResult Approve(Int64)”的不可为空类型“System.Int64”的参数“id”的空条目。评估控制器”。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:parameters] System.Web.Mvc.ActionDescriptor.ExtractParameterFromDictionary(ParameterInfo parameterInfo, IDictionary 2 parameters, MethodInfo methodInfo) +654635 System.Web.Mvc.<>c__DisplayClass1.<Execute>b__0(ParameterInfo parameterInfo) +18 System.Linq.WhereSelectArrayIterator2.MoveNext() +85 System.Linq.Buffer 1..ctor(IEnumerable1 source) +217 System.Linq.Enumerable.ToArray(IEnumerable 1 source) +78 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters) +133 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary 2 parameters) +27 System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28 System.Web.Mvc.Async.<>c__DisplayClass81.b__7(IAsyncResult) +12 System.Web.Mvc.Async.WrappedAsyncResult 1.End() +57 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +50 System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +58 System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +237 System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +12 System.Web.Mvc.Async.WrappedAsyncResult1.End() +57 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50 System.Web.Mvc.Async.<>c _DisplayClass2a.b_ 20() +24 System.Web.Mvc.Async.<>c _DisplayClass25.b_ 22(IAsyncResult asyncResult) +126 System.Web.Mvc.Async.WrappedAsyncResult 1.End() +57 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +45 System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +25 System.Web.Mvc.Async.WrappedAsyncResult1.End() +62 System.Web.Mvc.Controller。 EndExecuteCore(IAsyncResult asyncResult) +61 System.Web.Mvc.Async.<>c _DisplayClass4.b__3(IAsyncResult ar) +25 System.Web.Mvc.Async.WrappedAsyncResult1.End() +62 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +49 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +28 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +25 System.Web.Mvc.Async.WrappedAsyncResult1.End() +62 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +49 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult 结果) +9 System.Web.CallHandlerExecutionStep.System .Web.HttpApplication.IExecutionStep.Execute() +8862381 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

版本信息:Microsoft .NET Framework 版本:4.0.30319;ASP.NET 版本:4.0.30319.225

4

3 回答 3

1

HTML:

<input type="button" value="Approve" id="Approve" data-action="@Url.Action("Approve")" />

JS:

Number.tryParseInt = function(value) {
    return value.toString().match(/^(\d)/) != null;
}

Number.tryParseFloat = function(value) {
    return value.toString().match(/^(\d|\d\.|\.\d)/) != null;
}


$("#Approve").click(function () {

    var 
        id = $("#AjaxGrid tbody tr:first").data('pkey'),
        postParams = { id: 0 };

    if (!Number.tryParseFloat(id)) { 
        alert('id "' + id + '" is not a number');
        return false;
    }

    postParams.id = parseInt(id);

    $.post($(this).data('action'), postParams)
        .done(function(data) {
            alert('ok Approving: ' + data.EvaluationStatusID);
        })
        .fail(function () {
            alert('error occured while Approving');
        }); 

    return false;
});

C#:

如果不使用返回,为什么要使用 ActionResult?

[HttpPost]
public JsonResult Approve(long id)
{
    Evaluation evaluation = db.EvaluationRepository.GetByID(id);
    evaluation.EvaluationStatusID = Convert.ToInt32(EvaluationStatusType.Approved);

    return Json(evaluation);
}

需要更多的 '2.147.483.647'?,如果继续出现错误,请尝试使用 int:

[HttpPost]
public JsonResult Approve(int id)
{
    Evaluation evaluation = db.EvaluationRepository.GetByID(id);
    evaluation.EvaluationStatusID = Convert.ToInt32(EvaluationStatusType.Approved);

    return Json(evaluation);
}
于 2012-11-27T13:11:16.857 回答
0

从您的堆栈跟踪看来id,您的 AJAX 调用的参数为data-pkey空,对于所选元素为空。

如果没有看到您的 HTML,我无法告诉您为什么会这样,但您需要查看并更改$("#AjaxGrid tbody tr:first")选择器。

于 2012-11-27T11:13:50.023 回答
0

我认为存在循环引用问题

我的模特班

 public class Evaluation
{ 
   [Key]
   public int ID {get; set;} 
   public int UserID {get; set;} //whose evaluation is due 
   public DateTime EvaluationDueOn {get; set;} 
   public DateTime EvaluatedOn {get; set;}
   public decimal evaluationAmount {get; set;} 
   public string  comments {get; set;}
   public string  ApproverID {get; set;} //(userid of staff doing approval) 
   public int EvaluationStatusID { get; set; }


   public virtual Users EvaluatedUser { get; set; }

   public virtual Users ApprovingUser { get; set; }
}

使用导航属性,如

public virtual Users EvaluatedUser { get; set; 

public virtual Users ApprovingUser { get; set; }

并且由于此循环引用而发生序列化问题

于 2012-11-28T08:55:57.503 回答