2017-05-29 77 views
0

这里我试图点击id =“abc”按钮添加新的评论。点击按钮ajax必须调用TaskAssignedDailyLogController的Create操作。换句话说阿贾克斯没能命中TaskAssignedDailyLogsController
的创建行动现在的问题是,AJAX没有调用创建操作

下面是阿贾克斯阿贾克斯没有打控制器

<script> 
    $(document).ready(function() { 

    $(document).on('click', '#abc', function() { 
     debugger   
     var you = $("#myForm1").serialize();  
     var parameter = { taskAssignedDailyLog: you }; 

     $.ajax({ 
      url: '@Url.Action("Create", "TaskAssignedDailyLogs")', 
      type: "post", 
      dataType: "html", 
      data: parameter, 
      success: function (data) { 
       alert(data); 
       $(".newCommentList").empty(); 

       $(".newCommentList").html(data); 
      } 
     }); 

    }); 
}); 
</script> 


下面是Create.cshtml

@using (Html.BeginForm("Create", "TaskAssignedDailyLogs", FormMethod.Post, new { @id = "myForm1" })) 
{ 
    @Html.AntiForgeryToken() 

<div class="form-horizontal empcreate"> 
    @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 

    @Html.HiddenFor(x => x.TskAssId) 

    <div class="form-group"> 
     @Html.LabelFor(model => model.Comments, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Comments, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.Comments, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.WrkHrs, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.WrkHrs, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.WrkHrs, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.PercentCompleted, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.PercentCompleted, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.PercentCompleted, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <button type="button" value="Create" class="btn btn-default" id="abc"> Add</button> 
     </div> 
    </div> 
</div> 
} 



下面是控制器

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(TaskAssignedDailyLog taskAssignedDailyLog) 
    { 
     if (ModelState.IsValid) 
     { 

      taskAssignedDailyLog.PostedBy = 1; 
      taskAssignedDailyLog.PostedOn = DateTime.Now.Date; 
      db.TaskAssignedDailyLogs.Add(taskAssignedDailyLog); 
      db.SaveChanges(); 
      return RedirectToAction("Index", new { ProjectId =1 , TskAssId = taskAssignedDailyLog.TskAssId }); 
     }   
     return View(taskAssignedDailyLog); 
    } 
+0

您是否尝试过在重建后重建项目? –

+0

您的路线是如何定义的? – Tushar

+1

你应该做的第一件事是检查你的控制台和网络选项卡的Ajax错误,并在这里报告结果。那会给我们一个起点。你没有给出除“不起作用”之外的问题的性质 – ADyson

回答

0

我在这里看到了一个可能的解决方案。我不记得是谁写了这个代码,但它按预期工作:

/*********************************************** 
* AuthorizeAttribute filter for JsonResult methods 
* 
* Validates AntiForgeryToken from header of AJAX request. 
* AntiForgeryToken must be placed into that header. 
************************************************/ 

/* 
View 
    @Html.AntiForgeryToken() 
    <script> 
     var headers = {}; 
     headers["__RequestVerificationToken"] = $('[name=__RequestVerificationToken]').val(); 
     $.ajax({ 
      type: "POST", //Type must be POST 
      url: url, 
      dataType: "json", 
      headers: headers, 

Controller 
    [ValidateJsonAntiForgeryToken] 
    public JsonResult Method() { } 
*/ 

public sealed class ValidateJsonAntiForgeryToken : AuthorizeAttribute 
{ 
    public JsonResult deniedResult = new JsonResult() 
    { 
     JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
     Data = new { StatusCode = HttpStatusCode.Forbidden, Error = "Access Denied" } 
    }; 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     System.Diagnostics.Debug.WriteLine("ValidateJsonAntiForgeryToken"); 
     var request = filterContext.HttpContext.Request; 

     if (request.HttpMethod == WebRequestMethods.Http.Post && request.IsAjaxRequest() && request.Headers["__RequestVerificationToken"] != null) 
     { 
      AntiForgery.Validate(CookieValue(request), request.Headers["__RequestVerificationToken"]); 
     } 
     else 
     { 
      filterContext.Result = deniedResult; 
     } 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     System.Diagnostics.Debug.WriteLine("ValidateJsonAntiForgeryToken HandleUnauthorizedRequest "); 
     filterContext.Result = deniedResult; 
    } 

    private static string CookieValue(HttpRequestBase request) 
    { 
     var cookie = request.Cookies[AntiForgeryConfig.CookieName]; 
     return cookie != null ? cookie.Value : null; 
    } 
} 

只是新属性装饰你的方法: [ValidateJsonAntiForgeryToken]

有这样一个here

另一种解决方案

让我知道它是否适合你。