我遇到了麻烦,我需要一个带有每行表单的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和具有相同结果的字符串。
任何帮助都会很好。 感谢。
答案 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;}
}