2017-04-16 14 views
0

は、だから私はこのCSHTMLを持ってリターンビュー後に生成:コントローラでフォームPOSTパラメータが間違っ

[HttpPost] 
public ActionResult DeleteProduct(int productId, int? productVariantId, int quantity) 
{ 
    //...product gets deleted, etc. Not important for this question 

    //regenerate the view, same as when loading the 'Order' view initially 
    OrderWrapperViewModel model = GenerateOrderWrapperModel(); 
    return View("Order", model); 
} 

ロード順序ビューは次のようになります:

[HttpGet] 
public ActionResult Order() 
{ 
    OrderWrapperViewModel model = GenerateOrderWrapperModel(); 
    return View(model); 
} 
このバックエンドを呼び出し

@using (Html.BeginForm("DeleteProduct", "Shop", FormMethod.Post)) 
{ 
    @Html.Hidden("productId", product.ProductId); 
    @Html.Hidden("productVariantId", product.ProductVariantId); 
    @Html.Hidden("quantity", product.Quantity); 
    <button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span></button> 
} 

最初に削除を呼び出すと、IDが7、製品バリアントIDがの商品が削除されます。すべてがうまくいく。しかし、ページが返された後、ID 7の製品はもうリストされなくなり、ID 1の製品のみになります.2度目は製品ID:1と製品バリアントID:4です。

DeleteProductから戻ると、現在、URLは/ Shop/DeleteProductを表示しています。私はかみそりのコードをデバッグする場合:

generate form

右、正しいようですか?

まあ、HTMLは異なります。もちろん

different html

、ボタンをクリックするだけでなく、これらの不正なパラメータを渡します。私はこれが同じボタンであることを保証することができます、その時に表示される製品は1つだけです。

私は再度オーダービューにリダイレクトすることで解決しましたので、私はにもっと興味があります。理由はです。理由は、他の人にはエラーメッセージ(ModelStateを使用)が返されているからです。私がリダイレクトするともちろんそれは動作しません。

運用環境でも発生します。

+0

正しい方法はPRGパターンに従うことです。しかし、その動作の説明については、[TextBoxFor初期値を表示し、コードから更新された値ではありません]を参照してください(http://stackoverflow.com/questions/26654862/textboxfor-displaying-initial-value-not-the-value-updated -from-code/26664111#26664111) –

答えて

2

あなたが同じビューに戻るとき、ModelStateからの値が最初にレンダリングされているので、あなたはDeleteProductそれは古い値を得ていた理由で行ったようModelの値を変更しようとすると、この問題が発生し、この予想される動作ModelStateをもしそうであれば我々は

ModelState.Clear(); 

を使用する理由、それはModelから値を移入します空であるので、あなたがModelの値を変更している場合は、最初ModelStateから値をクリアする必要がありthatsの。あなたは、ブレークポイントを配置し、DeleteProductなどの操作を実行する通常の方法は、削除が完了した後に、別のアクションにリダイレクトすることです

1

enter image description here

このように見えます keyvalueチェックすることができます。

[HttpPost] 
public ActionResult DeleteProduct(int productId, int? productVariantId, int quantity) 
{ 
    //...product gets deleted, etc. Not important for this question 

    return RedirectToAction("Order"); 
} 

Orderメソッドで新しくModelStateを取得すると、ビューに渡すパラメータModelと競合しないようになり、ユーザーはブラウザに「より正確な」URLが表示されます。製品が削除されます(例: /Shop/DeleteProductの代わりに/Shop/Order)。

関連する問題