【问题标题】:Actionmethod erroneously called when posting to other actionmethod发布到其他操作方法时错误调用操作方法
【发布时间】:2017-01-20 12:32:46
【问题描述】:

我从下面的 Ajax 调用 actionmethod UpdateDiscount

function updateDiscount(e) {
        e.preventDefault();        
        var supplierOrderId = $("#supplier-order-id").val();
        var discount = $("#discount-input").val();
        console.log("supplierOrderId: " + supplierOrderId);
        console.log("discount: " + discount);
        $.ajax({
            url: '/supplierorder/updatediscount',
            type: "POST",
            data: { supplierOrderId: supplierOrderId, discount: discount },
            success: function (response) {
                alert("success");
                $("#supplier-order-table-container").html(response);
            },
            error: function (xhr, textStatus, errorThrown) {
                console.log(xhr);
                console.log(textStatus);
                console.log(errorThrown);
            }
        });
    }

UpdateDiscount 的签名如下所示:

<HttpPost()>
Public Function UpdateDiscount(supplierOrderId As Integer, discount As Decimal) As ActionResult

但是,我收到 500 内部错误:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 
'System.Int32' for method 'System.Web.Mvc.ActionResult 
Details(Int32, System.Web.Mvc.FormCollection)' in 'xxx.yyy.SupplierOrderController'.

由于某种原因,会调用 Details 操作方法。值得一提的是,我在该方法处放置的断点没有被命中。 UpdateDiscount 处的断点也未命中。我真的不明白这里有什么问题。我就像这样使用 Ajax 来调用项目中其他地方的操作方法。

编辑。 route.config(对不起 VB :P):

routes.MapRoute("SupplierOrderDetails", "supplierorder/{id}", New With {.controller = "SupplierOrder", .action = "Details"})
...
routes.MapRoute( _
            "Default", _
            "{controller}/{action}/{id}", _
            New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional} _
        )

有什么想法吗?

【问题讨论】:

  • 你确定Details 被调用updateDiscount 被触发的同一个事件吗?
  • 这个脚本的视图是从Details() GET 方法生成的吗?你是如何触发这个脚本的?
  • @StephenMuecke 按下按钮时调用该脚本。像这样:onclick="updateDiscount(event)"
  • @Shyju 我不知道为什么要调用 Details,但我收到了我提出的错误消息。我没有排除任何额外的代码来向您展示。
  • 请注意,Details() post 方法中的断点永远不会被命中,因为在执行代码之前会抛出错误。

标签: .net ajax asp.net-mvc vb.net asp.net-mvc-routing


【解决方案1】:

尝试添加带约束的路由并检查它在这种情况下是否适合您。

要么尝试添加 HTTP 动词路由约束。

我不是 100% 确定我的 VB.net 技能,但我希望你知道如何去做

routes.MapRoute("SupplierOrderDetails", "supplierorder/{id}", New With {.controller = "SupplierOrder", 
 action = "Details"},
 New With { httpMethod = new HttpMethodConstraint("GET") 
)

或添加正则表达式约束,如下所示

routes.MapRoute("SupplierOrderDetails", "supplierorder/{id}", New With {.controller = "SupplierOrder", 
 action = "Details"},
 New With {.Id= "\d+"}
)

在这些约束的帮助下,它不会将 url 路由到 details 操作并会跳过它。

如果您不想走这条路并想避免写约束。 您应该更改您的 url 模式并更改您使用路由指定此 url 的所有位置。

routes.MapRoute("SupplierOrderDetails", "supplierorderdetails/{id}", New With {.controller = "SupplierOrder", 
 action = "Details"}
)

【讨论】:

  • 我只是想回答你的评论。第二个选项为我做了。非常感谢
猜你喜欢
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多