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

Все компилировать Ok. Но когда количество выполнения всегда равно null, я уже пробовал количество как int и строку с тем же результатом.

Любая помощь будет хорошей. Спасибо.

ответ

1

Чтобы начать, вы можете удалить аргумент URL и связанное с ним скрытое поле. используйте Request.Referrer для возврата к предыдущему действию.

второе, количество не может быть нулевым, оно будет либо нулевым, либо отличным от нуля, но целое число не может быть нулевым.

третий, где находится Корзина? Если это объект домена, я должен передать идентификатор действию и загрузить корзину в действие. Я бы также объединил примитивов в контекстно-зависимую 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

Привет, о второй точке, равна нулю, когда я пытался количество в виде строки, когда количество используется как брошено целое ошибка. В-третьих, Cart является связанным объектом, это прекрасно работает. А Referrer, возможно, UrlReferrer? Спасибо за ваше время. – Gabriel

+0

Я до сих пор не загружал объект домена вне действия контроллера. следующая вещь, чтобы попытаться удалить явный тип = "текст" и значение = "". –

+0

СПАСИБО !!!! Теперь он исправлен ... я удалил value = "", и он отлично работает. Это было так мало ... :) – Gabriel

Смежные вопросы