我为自己的站点编写了一些jQuery脚本,因此将执行我的控制器方法-好的,该方法甚至没有被调用。似乎一切正常,除了甚至没有调用controller方法。
这是我的相关代码-按钮本身:
<a href="#" data-id="@product.Id" class="btn btn-info btn-lg" style="margin-left:60px">
<span class="glyphicon glyphicon-shopping-cart"></span> Add to cart
</a><br />
jQuery脚本:
<script type="text/javascript">
$(".btn.btn-info.btn-lg").click(function(event)
{
event.preventDefault();
var url = '@Html.Raw(Url.Action("AddToCart", "Cart", new {idinput = "IDI",amount="AM"}))';
url = url.replace("AM", $("#amounter").val());
url = url.replace("IDI", $(this).data("id"));
window.location.href = url;
});
</script>
请注意,我在名为CartController
的控制器中具有以下控制器方法:
[HttpPost]
public ActionResult AddToCart(int idinput, int amount)
按下按钮后,我到达:
http://localhost:59463/Cart/AddToCart?idinput=1&amount=44
好吧,我不确定该如何工作,但是甚至没有调用controller方法。
答案 0 :(得分:0)
您通过设置window.location.href
(这是GET
操作)进行重定向。您的控制器期望POST
。您应该执行一个表单发布或一些ajax来添加它。 GET
并不是将商品添加到购物车的好方法。
答案 1 :(得分:0)
该操作具有HttpPost
属性,这意味着该操作仅响应HTTP POST
请求。如果您只是尝试使用window.location.href = url
访问URL,它将执行HTTP GET
。这样您就会得到404。
从操作中删除[HttpPost]
属性,或让您的Javascript执行POST
操作,从语义上讲无论如何“添加”一个项目。
答案 2 :(得分:0)
完整解决方案
public class MvcControllerDiscovery : IMvcControllerDiscovery
{
private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;
public MvcControllerDiscovery(IActionDescriptorCollectionProvider actionDescriptorCollectionProvider)
{
_actionDescriptorCollectionProvider = actionDescriptorCollectionProvider;
}
public IEnumerable<MvcControllerInfo> GetControllers()
{
var items = _actionDescriptorCollectionProvider
.ActionDescriptors.Items
.Where(descriptor => descriptor.GetType() == typeof(ControllerActionDescriptor))
.Select(descriptor => (ControllerActionDescriptor)descriptor)
.GroupBy(descriptor => descriptor.ControllerTypeInfo.FullName)
.ToList();
foreach (var actionDescriptors in items)
{
if (!actionDescriptors.Any())
continue;
var actionDescriptor = actionDescriptors.First();
var controllerTypeInfo = actionDescriptor.ControllerTypeInfo;
foreach (var descriptor in actionDescriptors.GroupBy(a => a.ActionName).Select(g => g.First()))
{
var methodInfo = descriptor.MethodInfo;
if (IsProtectedAction(controllerTypeInfo, methodInfo))
{
}
}
}
}
private static bool IsProtectedAction(MemberInfo controllerTypeInfo, MemberInfo actionMethodInfo)
{
if (actionMethodInfo.GetCustomAttribute<AllowAnonymousAttribute>(true) != null)
return false;
if (controllerTypeInfo.GetCustomAttribute<AuthorizeAttribute>(true) != null)
return true;
if (actionMethodInfo.GetCustomAttribute<AuthorizeAttribute>(true) != null)
return true;
return false;
}
}