2017-10-18 88 views
1

我想只是jQuery的ajax调用来检索剃刀页面的用户列表。Asp.net核心2.0 Razor页面Ajax后

Users.cshtml.cs页:

public ActionResult OnPostList(string FirstName, string LastName,string IsActive) 
{ 
     var data=(from s in _db.SecurityUser 
       where s.FirstName.Contains(FirstName) && s.LastName.Contains(LastName) && (IsActive=="" || (IsActive =="Y" && s.IsActive==true) || (IsActive == "N" && s.IsActive == false)) 
       select s).OrderBy(s=>s.FirstName); 
     return new JsonResult(data); 
} 

JS调用:

$.ajax({ 
    type: "POST", 
    url: "/Security/Users?handler=List", 
    data: JSON.stringify({ 
     FirstName: $("#txtFirstName").val(), 
     LastName: $("#txtLastName").val(), 
     IsActive: $("#ddActive").val() 
    }), 
    contentType: "application/json", 
    dataType: "json", 
    success: function (response) { 
     var d = response.d; 
     var tblBody = $("#tblUsers > tbody"); 
     tblBody.empty(); 
     $.each(d, function (i, item) { 
      var modifiedDate = new Date(parseInt(item.ModifiedDate.substr(6))); 
      var $tr = $('<tr>').append(
       $('<td>').html("<a href='javascript:void(0)' onclick='fnDialogShow(" + item.UserID + ")'>Edit</a>"), 
       $('<td>').text(item.FirstName), 
       $('<td>').text(item.LastName), 
       $('<td>').text(item.IsActive ? "Yes" : "No") 
      ).appendTo(tblBody); 

     }); 
    }, 
    failure: function (response) { 
     alert(response.d); 
    } 

}); 

当它调用我得到一个400错误回来。试图找出我做错了什么。

+0

您所呼叫的行动 “* *的用户” 而不是 “* OnPostList *”。 – Werner

回答

1

马克你有HttpPost属性和更改Ajax调用您的网址/安全/ OnPostList

0

在行动中添加[HttpPost]

[HttpPost] 
    public ActionResult OnPostList(string FirstName, string LastName,string IsActive) 
    { 
      var data=(from s in _db.SecurityUser 
        where s.FirstName.Contains(FirstName) && s.LastName.Contains(LastName) && (IsActive=="" || (IsActive =="Y" && s.IsActive==true) || (IsActive == "N" && s.IsActive == false)) 
        select s).OrderBy(s=>s.FirstName); 
      return new JsonResult(data); 
    } 

使用此ScriptUsers.cshtml.cs

<script> 
    var url='@(Url.Action("OnPostList","ControllerName"))'; 
    var firstName= $("#txtFirstName").val(); 
    var lastName= $("#txtLastName").val(); 
    var isActive= $("#ddActive").val(); 
    $.post(Url,{FirstName:firstName,LastName=lastName,IsActive=isActive},function(data){ 
     var d = data.d; 
     var tblBody = $("#tblUsers > tbody"); 
     tblBody.empty(); 
     $.each(d, function (i, item) { 
     var modifiedDate = new Date(parseInt(item.ModifiedDate.substr(6))); 
     var $tr = $('<tr>').append(
     $('<td>').html("<a href='javascript:void(0)' onclick='fnDialogShow(" + item.UserID + ")'>Edit</a>"), 
     $('<td>').text(item.FirstName), 
     $('<td>').text(item.LastName), 
     $('<td>').text(item.IsActive ? "Yes" : "No") 
     ).appendTo(tblBody); 
     }); 
    }); 
</script> 
OnPostList
1

您的Aj的URL形成ax请求是正确的。有一点需要注意的是,Razor Pages旨在防止(CSRF/XSRF)攻击。因此,Antiforgery令牌生成和验证会自动包含在Razor Pages中。我相信这是这里的问题。如果您的HTML中有表单标签,您的网页可能会在网页上显示防伪标记。但是您需要在Ajax请求中传递相同的内容。

首先,使用@Html.AntiForgeryToken()添加防伪标记(如果不存在)。

然后,修改您的Ajax请求以在请求标头中发送相同的请求。

一样,

beforeSend: function (xhr) { 
 
     xhr.setRequestHeader("XSRF-TOKEN", 
 
      $('input:hidden[name="__RequestVerificationToken"]').val()); 
 
},

阅读此篇Handle Ajax Requests in ASP.NET Core Razor Pages了解更多有关使Ajax请求与ASP.NET核心剃刀页。

+0

这对我不起作用,请参阅工作示例的微软文档https://docs.microsoft.com/zh-cn/aspnet/core/security/anti-request-forgery#javascript – brthornbury

0

默认情况下,Razor页面被设计为受保护的CSRF攻击。

您必须在您的ajax请求中正确插入防伪令牌。

See the Documentation.

在ASP.NET 2.0的核心,它看起来像这样...

第一名这个代码到你的剃须刀视图的顶部:

// At the top of your page 
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf 
@functions{ 
    public string GetAntiXsrfRequestToken() 
    { 
     return Xsrf.GetAndStoreTokens(Context).RequestToken; 
    } 
} 

然后在你的Ajax请求,设置令牌标题。

$.ajax({ 
    type: "post", 
    headers: { 
     "RequestVerificationToken": '@GetAntiXsrfRequestToken()' 
    }, 
    url: '@Url.Action("Antiforgery", "Home")', 
    success: function (result) { 
     alert(result); 
    }, 
    error: function (err, scnd) { 
     alert(err.statusText); 
    } 
}); 
0

我对$ .ajax有不好的经验,我用$ .post代替。 我用validateAntiforgeryToken,但它不是必需的

$("#emailSubmit").click(function() { 

     $.post("/Projects/SendInvite", 
      { 
       Email: $("#email").val(), 
       Message: $("#message").val(), 
       __RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val() 
      } 

     ) 
     return false; 

    }); 

这是网络核心作用:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public IActionResult SendInvite(string Email, string Message) 
{ 

     //MailTest(); 
     var json = new List<string> 
     { 
     Email, 
     Message 
     }; 
     return new JsonResult(json); 
    }