2012-01-04 45 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 }); 
    } 

一切编译确定。但是当执行数量总是为空时,我已经尝试了数量为int和具有相同结果的字符串。

任何帮助将是wellcome。 谢谢。

回答

1

要开始,您可以删除URL参数和关联的隐藏字段。请使用Request.Referrer代替返回到上一个操作。

秒,数量不能为空,它可以是零或非零,但整数不能为空。

第三,Cart是从哪里来的?如果这是域对象,我会将ID传递给操作并在操作中加载购物车。我也会将这些主要元素结合到一个特定于上下文的DTO中。

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

其中AddToCartCommand是

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

您好,约第二点,为空,当我试图量为字符串,当为整引发错误使用量。第三,购物车是绑定的对象,这工作正常。推荐人可能是UrlReferrer?谢谢你的时间。 – Gabriel 2012-01-04 18:18:01

+0

我仍然不会加载控制器操作之外的域对象。接下来要尝试的是删除显式type =“text”和value =“”。 – 2012-01-04 18:20:52

+0

谢谢!!!!现在它是固定的...我删除了值=“”,它的效果很好。它太小了...... :) – Gabriel 2012-01-04 18:25:11