Почему мое представление не отображается внутри _Layout.cshtml

#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 не ищет его в общей папке.