0

jQuery を使用して MVC4 アプリケーションでアクション メソッドを呼び出そうとしています。ファンシーボックスに表示される編集フォームのボタンを使用しています:

<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)' の null 非許容型 'System.Int64' のパラメーター 'id' の null エントリが含まれています。オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。パラメータ名: パラメータ

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.ArgumentException: パラメーター ディクショナリには、'CubicHRMWeb.Areas. Employees.Controllers.EvaluationController'. オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。パラメータ名: パラメータ

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[ArgumentException: パラメーター ディクショナリに、'CubicHRMWeb.Areas.Employees.Controllers.評価コントローラ」。オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。パラメータ名: 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 ソース) +217 System.Linq.Enumerable.ToArray(IEnumerable 1 source) +78 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 パラメータ) +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#:

return を使用しないのに、なぜ 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

循環参照の問題があると思います

私のモデルクラス

 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 に答える
0

スタック トレースからid、AJAX 呼び出しのパラメーターが null でdata-pkeyあり、選択した要素に対して空であるように見えます。

HTML を見ないと、これがなぜなのかわかりませんが、$("#AjaxGrid tbody tr:first")セレクターを見て変更する必要があります。

于 2012-11-27T11:13:50.023 に答える