MVC WebGrid中的窗体

本文关键字:窗体 WebGrid MVC | 更新日期: 2023-09-27 18:19:31

我遇到了一个问题,我需要一个每行都有一个表单的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 });
    }

一切都可以编译。但当execute quantity总是为null时,我已经尝试过将quantity作为int和string,结果相同。

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

MVC WebGrid中的窗体

首先,您可以删除URL参数和相关的隐藏字段。请使用Request.Referrer返回到上一个操作。

其次,数量不能为null,它可以是零或非零,但整数不能为null。

第三,Cart从哪里来?如果这是域对象,我会将id传递给操作,并在操作中加载cart。我还将把主词组合成一个上下文特定的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;}
}