2017-01-20 39 views
1

我叫actionmethod UpdateDiscount從阿賈克斯下方時,誤稱爲:Actionmethod張貼到其他actionmethod

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} _ 
     ) 

任何想法?

+0

你確定'Details'被調用的'updateDiscount'被激發的同一事件? – Shyju

+0

該腳本是從'Details()'GET方法生成的視圖嗎?你怎麼觸發這個腳本? –

+0

@StephenMuecke按下按鈕時會調用該腳本。像這樣: onclick =「updateDiscount(event)」 – hellogoodnight

回答

1

嘗試添加約束路線,並檢查它是否適合您。

要麼嘗試添加HTTP動詞路由約束。

我不知道我的VB.net技能100%,但我希望你有一個想法如何做到這一點

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的所有地方。

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

我只是要回答你的評論。第二個選擇是爲我做的。非常感謝 – hellogoodnight

相關問題