阿贾克斯没有打控制器
问题描述:
这里我试图点击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);
}
答
我在这里看到了一个可能的解决方案。我不记得是谁写了这个代码,但它按预期工作:
/***********************************************
* 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
另一种解决方案让我知道它是否适合你。
您是否尝试过在重建后重建项目? –
您的路线是如何定义的? – Tushar
你应该做的第一件事是检查你的控制台和网络选项卡的Ajax错误,并在这里报告结果。那会给我们一个起点。你没有给出除“不起作用”之外的问题的性质 – ADyson