MVC WebGrid中的表单

时间:2012-01-04 18:03:11

标签: c# asp.net-mvc model-view-controller webgrid

我遇到了麻烦,我需要一个带有每行表单的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和具有相同结果的字符串。

任何帮助都会很好。 感谢。

1 个答案:

答案 0 :(得分: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;}
}