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,结果相同。
任何帮助都会很好的。谢谢
首先,您可以删除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;}
}