不调用控制器方法

时间:2018-07-06 15:54:50

标签: c# jquery asp.net asp.net-mvc asp.net-mvc-4

我为自己的站点编写了一些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方法。

3 个答案:

答案 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;
        }
    }