I have a view that is NOT a form. I am doing an Ajax POST with jQuery to the server without having any form at all. It displays a blog and also it accepts a blog comment. I want to take that blog comment and save it to the database.
I have a @Html.AntiForgeryToken() right before the text field (the blog comment) that I want to use to save to the database.
I have the [ValidateAntiForgeryToken] attribute before the controller aciton method.
I'm getting: The required anti-forgery form field"__RequestVerificationToken" is not present in asp.net mvc
- [HttpPost][ValidateAntiForgeryToken]
- public async Task ProcessSaveBlogComment(BlogComment blogComment, string userProfileProcessType) {
- if (ModelState.IsValid) {
- blogComment.UserId = Convert.ToInt32(Session["UserId"]);
- BLL_BlogPublished bll_BlogPublished = new BLL_BlogPublished();
- ProcessSaveBlogCommentResults processSaveBlogCommentResults = new ProcessSaveBlogCommentResults();
-
- try {
- processSaveBlogCommentResults = await bll_BlogPublished.ProcessSaveBlogComment(blogComment, Session["UserName"].ToString(), userProfileProcessType);
-
- if (processSaveBlogCommentResults.ApiErrorMessage == null) {
- if (processSaveBlogCommentResults.Status == 2) {
- ViewBag.errormessage = "Process Violation: You are not the 'blog comment' creator so you cannot update the blog comment.";
- }
- else if (processSaveBlogCommentResults.Status == 3) {
- ViewBag.errormessage = "Process Violation: Not the correct 'blog id' so cannot update the blog comment.";
- }
- }
- else {
- ViewBag.errormessage = processSaveBlogCommentResults.ApiErrorMessage;
- }
- }
- catch(Exception ex1) {
- exceptionMessage = "Server error on saving the blog comment. Please contact the administrator.";
-
- try {
- ClientErrorResult clientErrorResult = new ClientErrorResult();
-
- clientErrorResult = await ProcessClientError(Session["UserName"].ToString(), ex1.Message, "Server error on saving the blog comment. User name: " + Session["UserName"] + ". Post method: ProcessSaveBlogComment.");
-
- if (clientErrorResult.ApiErrorMessage == null) {
- ViewBag.errormessage = exceptionMessage;
- }
- else {
- ViewBag.errormessage = clientErrorResult.ApiErrorMessage;
- }
- }
- catch(Exception ex2) {
- ViewBag.errormessage = "Failure in ProcessClientError. Exception error: " + ex2.Message + ". Original error: " + exceptionMessage;
- }
- }
- }
-
- return RedirectToAction("GetBlogComments", "BlogPublished", new {
- blogId = blogComment.BlogId
- });
- }
Before leaving the AddAntiForgeryToken function - the console log.
The network tab - cookies.
Part 1 of the Network tab - header (has the request verification token in the cookie).
Part 2 of the Network tab - header (has my data to send to the controller).
Error:
8/13/2020 4:49:56 PM
------------------------------------------------------------------------------------------------
Controller Name :- BlogPublished
Action Method Name :- ProcessSaveBlogComment
------------------------------------------------------------------------------------------------
System.Web.Mvc.ExceptionContext
Message ---
{0}The required anti-forgery form field "__RequestVerificationToken" is not present.
.Net Error ---
{0}Check MVC Ajax Code For Error
Source ---
{0}System.Web.WebPages
StackTrace ---
{0} at System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext, IIdentity identity, AntiForgeryToken sessionToken, AntiForgeryToken fieldToken)
at System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBase httpContext)
at System.Web.Helpers.AntiForgery.Validate()
at System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization(AuthorizationContext filterContext)
at System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass3_1.b__0(AsyncCallback asyncCallback, Object asyncState)
TargetSite ---
{0}Void ValidateTokens(System.Web.HttpContextBase, System.Security.Principal.IIdentity, System.Web.Helpers.AntiXsrf.AntiForgeryToken, System.Web.Helpers.AntiXsrf.AntiForgeryToken)