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.
Теперь я не знаю, как правильно сделать это в 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"
поэтому нет необходимости добавлять эту опцию.