发布到其他操作方法时错误地调用了操作方法
Actionmethod erroneously called when posting to other actionmethod
我从下面的 Ajax 调用操作方法 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就这样在我项目的其他地方调用action方法。
编辑。 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} _
)
有什么想法吗?
尝试添加带约束的路由并检查它是否适用于这种情况。
要么尝试添加 HTTP Verb 路由约束。
我不是 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 路由到详细信息操作并将跳过它。
如果你不想走这条路,想避免写约束。
您应该更改您的 url 模式并更改您已使用 route.url 指定此 url 的所有位置。
routes.MapRoute("SupplierOrderDetails", "supplierorderdetails/{id}", New With {.controller = "SupplierOrder",
action = "Details"}
)
我从下面的 Ajax 调用操作方法 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就这样在我项目的其他地方调用action方法。
编辑。 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} _
)
有什么想法吗?
尝试添加带约束的路由并检查它是否适用于这种情况。
要么尝试添加 HTTP Verb 路由约束。
我不是 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 路由到详细信息操作并将跳过它。
如果你不想走这条路,想避免写约束。 您应该更改您的 url 模式并更改您已使用 route.url 指定此 url 的所有位置。
routes.MapRoute("SupplierOrderDetails", "supplierorderdetails/{id}", New With {.controller = "SupplierOrder",
action = "Details"}
)