#c# #asp.net #asp.net-mvc-4 #razor
#c# #asp.net #asp.net-mvc-4 #razor
Вопрос:
Я учусь ASP.NET из книги Про ASP.NET 4.0, но я застрял на добавлении CartController и Views/Cart/Index.cshtml
Я добавил что-то вроде этого:
public class CartController : Controller
{
private IProductRepository repository;
public CartController(IProductRepository repo)
{
repository = repo;
}
public ViewResult Index(string returnUrl)
{
return View("Index", "~/Views/Shared/_Layout.cshtml", new CartIndexViewModel
{
Cart = GetCart(),
ReturnUrl = returnUrl
});
}
public RedirectToRouteResult AddToCart(int productId, string returnUrl)
{
Product product = repository.Products
.FirstOrDefault(p => p.ProductID == productId);
if (product != null)
{
GetCart().AddItem(product, 1);
}
return RedirectToAction("Index", new { returnUrl });
}
private Cart GetCart()
{
Cart cart = (Cart)Session["Cart"];
if (cart == null)
{
cart = new Cart();
Session["Cart"] = cart;
}
return cart;
}
}
}
Затем я добавил в корзину-> Представление действия индекса (щелкните правой кнопкой мыши -> Добавить представление), вот так:
@model SportsStore.WebUI.Models.CartIndexViewModel
@{
ViewBag.Title = "Sklep sportowy: Twój koszyk";
}
<h2>Twój koszyk</h2>
<table width="90%" align="center">
<thead>
<tr>
<th align="center">Ilość</th>
<th align="left">Produkt</th>
<th align="right">Cena</th>
<th align="right">Wartość</th>
</tr>
</thead>
<tbody>
@foreach(var line in Model.Cart.Lines) {
<tr>
<td align="center">@line.Quantity</td>
<td align="left">@line.Product.Name</td>
<td align="right">@line.Product.Price.ToString("c")</td>
<td align="right">@((line.Quantity * line.Product.Price).ToString("c"))</td>
</tr>
}
</tbody>
<tfoot>
<tr>
<td colspan="3" align="right">Razem:</td>
<td align="right">
@Model.Cart.ComputeTotalValue().ToString("c")
</td>
</tr>
</tfoot>
</table>
<p align="center" class="actionButtons">
<a href="@Model.ReturnUrl">Kontynuuj zakupy</a>
</p>
В моем описании продукта на странице у меня есть кнопка, которая добавляет товар в корзину, а затем перенаправляет на эту localhost:port/Cart/Index
страницу. Вот эта кнопка навигации:
@model SportsStore.Domain.Entities.Product
<div class="item">
<h3>@Model.Name</h3>
@Model.Description
@using(Html.BeginForm("AddToCart", "Cart")) {
@Html.HiddenFor(x => x.ProductID)
@Html.Hidden("returnUrl", Request.Url.PathAndQuery)
<input type="submit" value=" Dodaj do koszyka" />
}
<h4>@Model.Price.ToString("c")</h4>
</div>
Проблема в том, что корзина работает отлично, но ее представление не встроено в основной макет /Shared/_Layout.cshtml
. Оно просто отображается как отдельная страница, которая не содержит никаких HTML-заголовков или основного текста, только раздел содержимого веб-сайта.
Проект github того же примера, который я нашел, выполнен точно так же, как и основной проект Visual Studio. https://github.com/akatakritos/SportsStore
Я проверил списки кода книги и не могу найти никаких ошибок. Почему оно неправильно отображается как часть основного макета? Но находится в отдельном представлении!
Спасибо за любую помощь.
Редактировать:
У меня есть Views/Shared/_ViewStart.cshtml
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
Комментарии:
1. Вы забыли установить макет в _ViewStart.cshtml? Что-то вроде этого @{ Layout = «_Layout»; }
Ответ №1:
Переместите ваш _ViewStart.cshtml в Views/_ViewStart.cshtml
(вместо Views/Shared/ ). MVC не ищет его в общей папке.