Jquery 使用AJAX调用重定向正在运行的用户身份验证表单
我正在使用ASP MVC、jQuery和AJAX开发一个.Net Web应用程序。 我有一个产品列表,当我点击产品的详细信息按钮时,我会在一个包含“添加到购物车”按钮的详细信息视图中被重定向 此按钮调用包含以下段代码的操作:Jquery 使用AJAX调用重定向正在运行的用户身份验证表单,jquery,ajax,asp.net-mvc,razor,Jquery,Ajax,Asp.net Mvc,Razor,我正在使用ASP MVC、jQuery和AJAX开发一个.Net Web应用程序。 我有一个产品列表,当我点击产品的详细信息按钮时,我会在一个包含“添加到购物车”按钮的详细信息视图中被重定向 此按钮调用包含以下段代码的操作: [Authorize] public ActionResult AddToCart(int articleId) { ViewBag.CartCount = 0; List<Cart> cart = nul
[Authorize]
public ActionResult AddToCart(int articleId)
{
ViewBag.CartCount = 0;
List<Cart> cart = null;
if (User.Identity.IsAuthenticated)
{
if (Session["Cart"] == null)
{
cart = new List<Cart>();
cart.Add(new Cart { ArticleId = articleId, Count = 1, DateCreated = DateTime.Now });
Session["Cart"] = cart;
}
else
{
cart = Session["Cart"] as List<Cart>;
var alreadyOrdered = cart.FirstOrDefault(x => x.ArticleId == articleId);
cart.Remove(alreadyOrdered);
if (alreadyOrdered != null)
{
alreadyOrdered.Count++;
cart.Add(alreadyOrdered);
}
else
{
cart.Add(new Cart { ArticleId = articleId, Count = 1, DateCreated = DateTime.Now });
}
Session["Cart"] = cart;
}
ViewBag.CartCount = cart.Count;
return Content(cart.Count.ToString());
}
return RedirectToAction("Login", "Account");
}
[授权]
公共行动结果AddToCart(int articleId)
{
ViewBag.CartCount=0;
列表购物车=空;
if(User.Identity.IsAuthenticated)
{
if(会话[“购物车”]==null)
{
购物车=新列表();
添加(新购物车{ArticleId=ArticleId,Count=1,DateCreated=DateTime.Now});
会话[“购物车”]=购物车;
}
其他的
{
购物车=会话[“购物车”]作为列表;
var alreadyOrdered=cart.FirstOrDefault(x=>x.ArticleId==ArticleId);
推车。移除(已准备好);
如果(alreadyOrdered!=null)
{
alreadyOrdered.Count++;
购物车添加(已预读或预编);
}
其他的
{
添加(新购物车{ArticleId=ArticleId,Count=1,DateCreated=DateTime.Now});
}
会话[“购物车”]=购物车;
}
ViewBag.CartCount=购物车.Count;
返回内容(cart.Count.ToString());
}
返回重定向操作(“登录”、“帐户”);
}
在我看来,我有以下代码:
@model WebShop.Web.ViewModels.ArticleViewModel
<div class="row">
<div class="col-md-6">
<img src="http://placehold.it/400x250/000/fff"
alt="Kodak Brownie Flash B Camera"
class="image-responsive" />
</div>
<div class="col-md-6">
<div class="row">
<div class="col-md-12">
<h1>@Model.Label</h1>
</div>
</div>
<div class="row">
<div class="col-md-12">
<span class="label label-default">@Model.CategoryName</span>
<span class="label label-info">@Model.SubCategoryName</span>
</div>
</div>
<div class="row">
<div class="col-md-12">
<p class="description">
@Model.Description
</p>
</div>
</div>
<div class="row">
<div class="col-md-12 bottom-rule">
<h2 class="product-price">@Model.Price.ToString("###") €</h2>
</div>
</div>
<div class="row add-to-cart">
<div class="col-md-5 product-qty">
<span class="btn btn-default btn-lg btn-qty">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
</span>
<input class="btn btn-default btn-lg btn-qty" value="1" />
<span class="btn btn-default btn-lg btn-qty">
<span class="glyphicon glyphicon-minus" aria-hidden="true"></span>
</span>
</div>
<div class="col-md-4">
<button class="btn btn-lg btn-brand btn-full-width addToCart" id="@Model.Id">
Ajouter au panier
</button>
</div>
</div><!-- end row -->
<div class="row">
<div class="col-md-12 bottom-rule top-10"></div>
</div>
</div>
</div>
<script>
$(document).ready(function () {
$('.addToCart').click(function () {
var articleId = parseInt($(this).attr('id'));
$.ajax({
type: 'POST',
url: '@Url.Action("AddToCart", "Shopping")',
data: { articleId: articleId },
success: function (data) {
$('#CartModal').html(data);
console.log(data);
},
error: function (err) {
console.log(err);
}
});
});
});
</script>
@model WebShop.Web.ViewModels.ArticleViewModel
@型号标签
@Model.CategoryName
@Model.subcategory名称
@型号.说明
@Model.Price.ToString(“####”)欧元
阿霍帕尼尔酒店
$(文档).ready(函数(){
$('.addToCart')。单击(函数(){
var articleId=parseInt($(this.attr('id'));
$.ajax({
键入:“POST”,
url:'@url.Action(“AddToCart”,“Shopping”),
数据:{articleId:articleId},
成功:功能(数据){
$('#cartmodel').html(数据);
控制台日志(数据);
},
错误:函数(err){
控制台日志(err);
}
});
});
});
我的愿望是,当我单击“添加到购物车”按钮时,用户未通过身份验证,必须将其重定向到身份验证页面(我使用ASP模板进行身份验证),然后继续选择产品。
当用户已连接时,必须返回该值。
换句话说,如果用户未通过身份验证,我希望将其重定向到登录页面
我如何处理这种情况
提前感谢您的帮助(这是我在StackOverFlow中的第一篇文章)您应该从您的操作方法返回一个json响应,并在ajax调用中检查这些数据并确定要做什么(重定向到登录页面或其他页面或其他内容) 当一切顺利时,您可以像这样返回JSON
{
"status":"success",
"cartItemCount":3
}
{
"status":"notloggedin"
"redirectUrl":"account/login"
}
如果用户未经过身份验证,则返回如下内容
{
"status":"success",
"cartItemCount":3
}
{
"status":"notloggedin"
"redirectUrl":"account/login"
}
所以你的动作方法代码应该是
if (User.Identity.IsAuthenticated)
{
// set to cart session
return Json(new { status="success", cartItemCount=cart.Count()});
}
else
{
var rUrl="url to login action here"; //use UrlHelper to generate this
return Json(new { status="notloggedin", redirectUrl=redirectUrl });
}
现在,在成功回调中,检查status属性并根据需要重定向
success: function (data) {
if(data.status==="success")
{
$('#CartModal').html(data.cartItemCount);
}
else if(data.status==="notloggedin")
{
window.location.href=data.redirectUrl;
}
else
{
alert("some error");
}
}
最后,要在action方法中生成url,可以尝试以下操作
var urlBuilder = new UrlHelper(Request.RequestContext);
var url = urlBuilder.Action("YourAction", "YourController");
您应该从操作方法返回一个json响应,并在ajax调用中检查此数据并确定要做什么(重定向到登录页面或其他页面或其他内容) 当一切顺利时,您可以像这样返回JSON
{
"status":"success",
"cartItemCount":3
}
{
"status":"notloggedin"
"redirectUrl":"account/login"
}
如果用户未经过身份验证,则返回如下内容
{
"status":"success",
"cartItemCount":3
}
{
"status":"notloggedin"
"redirectUrl":"account/login"
}
所以你的动作方法代码应该是
if (User.Identity.IsAuthenticated)
{
// set to cart session
return Json(new { status="success", cartItemCount=cart.Count()});
}
else
{
var rUrl="url to login action here"; //use UrlHelper to generate this
return Json(new { status="notloggedin", redirectUrl=redirectUrl });
}
现在,在成功回调中,检查status属性并根据需要重定向
success: function (data) {
if(data.status==="success")
{
$('#CartModal').html(data.cartItemCount);
}
else if(data.status==="notloggedin")
{
window.location.href=data.redirectUrl;
}
else
{
alert("some error");
}
}
最后,要在action方法中生成url,可以尝试以下操作
var urlBuilder = new UrlHelper(Request.RequestContext);
var url = urlBuilder.Action("YourAction", "YourController");