2012-01-04 16 views
0

問題が発生しました。各行のフォームを持つwebgridが必要ですが、これを実現しましたが、送信ボタンをクリックするとコントローラは入力テキストを受け取りません。MVC WebGrid内のフォーム

これは、ビューのコードである:

@grid.GetHtml(
    tableStyle: "mGrid", 
    headerStyle: "head", 
    alternatingRowStyle: "alt", 
    rowStyle: "altRow", 

    columns: grid.Columns(
       grid.Column(columnName: "Id", header: "Id", style: "prefix"), 
       grid.Column(columnName: "Trademark", header: "Marca", style: "trademark"), 
       grid.Column(columnName: "Price", header: "Precio", style: "price", format: @<text>@item.Price.ToString("N2")</text>), 
       grid.Column(format: (item) => 
           { 
            System.Text.StringBuilder html = new System.Text.StringBuilder(); 

            html.Append("<form action=\"/Cart/AddToCart\" method=\"get\">"); 
            html.Append("<input type=\"text\" value=\"\" style=\"width:50px; text-align:center; \" name=\"quantity\" id=\"quantity\" />"); 
            html.Append("<input type=\"submit\" value=\"Agregar\" class=\"btnAdd\" />"); 
            html.Append("<input type=\"hidden\" name=\"productId\" value=\"" + item.Value.Id + "\"/>"); 
            html.Append("<input type=\"hidden\" name=\"returnUrl\" value=\"" + Request.Url + "\"/>"); 
            html.Append("</form>"); 

            return new HtmlString(html.ToString()); 
           } 
          ) 
      ) 
    ) 

そして、これはコントローラの一部である:

public class CartController : Controller 
{ 
    private IDataRepository repository; 

    ... 

    public RedirectToRouteResult AddToCart(Cart cart, int productId, int quantity, string returnURL) 
    { 
     Product product = repository.Products.FirstOrDefault(p => p.Id == productId); 

     if (product != null) 
      cart.AddItem(product, quantity); 

     return RedirectToAction("Index", new { returnURL }); 
    } 

すべてが[OK]をコンパイル。しかし、実行数量が常にnullの場合、私はすでにintとstringの数量を同じ結果で試しています。

どのような助けもうまくいくでしょう。おかげさまで

答えて

1

開始するには、URL引数と関連付けられた非表示フィールドを削除することができます。 Request.Referrerを使用して代わりに前のアクションに戻ります。

秒、数量はゼロにすることはできません。ゼロまたはゼロ以外の値を指定できますが、整数はnullにできません。

3番目、カートはどこから来ますか?これがドメインオブジェクトであれば、IDをアクションに渡してアクション内にカートをロードします。私はまた、そのプリミティブを文脈特有のDTOに組み合わせるだろう。 AddToCartCommandが

class AddToCartCommand 
{ 
    public int CartId {get;set;} 
    public int ProductId {get;set;} 
    public int Quantity {get;set;} 
} 
+0

ある

AddToCart(AddToCartCommand input) { var cart = repository.Carts.First(input.CartId); var product = repository.Products.First(input.ProductId); cart.Add(product, input.Quantity); return RedirectToAction(Request.Referrer); } 

iは整数エラーがスローされる量が使用されている文字列として数量を試みた場合こんにちは、第二の点については、ヌルです。第三に、カートはバインドされたオブジェクトです。それはうまく動作します。そして紹介者はおそらくUrlReferrerですか?御時間ありがとうございます。 – Gabriel

+0

私はまだコントローラのアクションの外にドメインオブジェクトをロードしません。次の試みは明示的なtype = "text"とvalue = ""を削除することです。 –

+0

感謝!!!!今は修正されました...私はvalue = ""を削除しました。それはとても小さかったです:) – Gabriel

関連する問題