Ajax.Begin форма не рендерит правильное действие.NET mvc4

У меня странная проблема с моей формой Ajax. Я пытаюсь отправить сообщение в свой контроллер корзины, когда пользователь нажимает кнопку "Добавить в корзину". Я просто хочу опубликовать идентификатор продукта из скрытого поля, вернуть строку и обновить div с сообщением об ошибке. Следующая Razor разметка на мой взгляд...

@using (Ajax.BeginForm("AddToCart", "Carts", new AjaxOptions { OnSuccess="OnSuccess", HttpMethod="Post", Url="/Carts/AddToCart/"  }, new { @style = "display:inline-block"}))
        {
            @Html.HiddenFor(model => model.Product_ID)
            <input type="submit" class="button round large primary" value="Add To Cart" />
        }

И в моем контроллере корзины у меня есть следующий код для добавления в корзину, и я возвращаю строку, которую я могу использовать с помощью javascript для обновления div, для которого я хочу отобразить сообщение, или иметь дескриптор структуры для себя.

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult AddToCart(int product_ID)
        {
            if (db.Products.Any(product => product.Product_ID == product_ID))
            {
                //var successfulAddToCart = false;
                var cartItem = new Cart();

               // cartItem.CartID = Guid.NewGuid();

                if (Request.IsAuthenticated)
                {
                    cartItem.Customer = db.Customers.FirstOrDefault(customer => customer.Email == User.Identity.Name);
                }                    
                else//not logged in, need to remember them somehow
                {

                    var CartCookie = new HttpCookie("CartID", Guid.NewGuid().ToString());
                    CartCookie.Expires.AddDays(2);
                    Request.Cookies.Add(CartCookie);
                    cartItem.Customer = new Customer();
                }


                cartItem.IsCheckedOut = false;
                cartItem.Quantity = 1;
                cartItem.Sku = db.SKU_Table.FirstOrDefault(sku => sku.Product_ID == product_ID);

                db.Cart.Add(cartItem);
                db.SaveChanges();


                return Content("Add to cart was successful");
            }
            else
                return Content("Add to cart was not successful");


        }

Теперь главная проблема, с которой я сталкиваюсь, заключается в том, что форма отображается с неверным действием. Вот что отображается в html.

Отображается HTML разметки

Теперь я не знаю, как правильно сделать это в MVC, так как я немного новичок в фреймворке, но я бы хотел избежать вызова AJAX в javascript, если есть лучший способ. Я не уверен, в чем причина неудачи с неправильным действием на дом. Я подозреваю, что это связано с моим файлом route.config, как будто я изменяю порядок или маршруты в файле, они влияют на результат действия. Я могу опубликовать это в обновлении, если это уместно, но я полагаю, что выброшу это на экспертизу переполнения стека. Спасибо.

1 ответ

Решение

Вы используете неправильную перегрузку, где 2-й параметр - это значения маршрута, поэтому вы получаете ....?Length=5 (string имеет одно свойство с именем Length и есть 5 символов в "Тележках") . Используйте эту перегрузку (и удалите ненужные Url опция)

@using (Ajax.BeginForm("AddToCart", "Carts", new { product_ID = Model.Product_ID }, 
    new AjaxOptions { OnSuccess="OnSuccess", HttpMethod="Post" }, 
    new { @style = "display:inline-block"}))
{
    <input type="submit" class="button round large primary" value="Add To Cart" />
}

Обратите внимание, что вам не нужен скрытый ввод для Product_ID так как он уже был добавлен в качестве значения строки маршрута / запроса.

Обратите внимание также на значение по умолчанию HttpMethod является "Post" поэтому нет необходимости добавлять эту опцию.

Другие вопросы по тегам