2017-05-29 5 views
0

Hier versuche ich, einen neuen Kommentar auf den Klick der Schaltfläche ID = "abc" hinzuzufügen. Beim Klicken auf die Schaltfläche muss ein Ajax aufgerufen werden, von dem die Create-Aktion von TaskAssignedDailyLogController aufgerufen wird. Mit anderen Worten Ajax nicht schaffen getroffen hat Wirkung von TaskAssignedDailyLogsController
Nun, das Problem ist, dass Ajax die Aktion nicht nennen schaffen

unten AjaxAjax traf den Controller nicht

<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> 


Unten ist 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> 
} 



Im Folgenden finden Sie Regler

[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

Haben Sie versucht, Ihr Projekt nach Änderungen neu zu erstellen? –

+0

Wie sind deine Routen definiert? – Tushar

+1

Als erstes sollten Sie Ihren Konsolen- und Netzwerk-Tab auf Ajax-Fehler prüfen und die Ergebnisse hier melden. Das gibt uns einen Ausgangspunkt, von dem aus wir arbeiten können. Sie haben keinen Hinweis auf die Art des Problems gegeben außer "funktioniert nicht" – ADyson

Antwort

0

Ich sah eine mögliche Lösung für dieses Problem einmal hier in SO. Ich erinnere mich nicht, wer diesen Code geschrieben, aber es funktioniert wie erwartet:

/*********************************************** 
* 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; 
    } 
} 

einfach Ihre Methode mit dem neuen Attribut schmücken: [ValidateJsonAntiForgeryToken]

Es gibt eine andere Lösung wie dieser here ist

Lassen Sie mich wissen, ob es für Sie funktioniert.

Verwandte Themen