【问题标题】:ASP.NET issues with Navigation, Razor Views, Controllers导航、剃刀视图、控制器的 ASP.NET 问题
【发布时间】:2021-12-07 00:10:44
【问题描述】:

我正在为学校开发一个简单的网站应用程序,但我遇到了导航问题。

我在这个项目中使用 Visual Studio 2019。

我正在尝试从Views/Home/Index 导航到Views/Product/List,但一直无法导航(404 错误)。

这里是_Layout

<nav class="navbar navbar-expand-md navbar-dark bg-primary">
        <a class="navbar-brand" href="/">SportsPro</a>
        <button class="navbar-toggler" type="button"
                data-toggle="collapse" data-target="#navbarSupportedContent"
                aria-controls="navbarSupportedContent" aria-expanded="false"
                aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        <nav class="collapse navbar-collapse" id="navbarSupportedContent">
            <div class="navbar-nav mr-auto">
                <a class="nav-item nav-link active" asp-controller="Home" asp-action="Index">Home</a>
                <a class="nav-item nav-link active" asp-controller="Product" asp-action="List">Products</a>
                <a class="nav-item nav-link active" asp-controller="Technician" asp-action="List">Technicians</a>
                <a class="nav-item nav-link active" asp-controller="Customer" asp-action="List">Customers</a>
                <a class="nav-item nav-link active" asp-controller="Incident" asp-action="List">Incidents</a>
                <a class="nav-item nav-link active" asp-controller="Registration" asp-action="GetCustomer">Registrations</a>
            </div>
            <div class="navbar-nav navbar-right">
                <a class="nav-item nav-link active" asp-controller="Home" asp-action="About">About</a>
            </div>
        </nav>
    </nav>

查看Views/Product/List

@model Product
@{
    ViewData["Title"] = "Products";
}
<h1>Product Manager</h1>
<form>...

HomeController:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using SportsPro.Models;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

namespace SportsPro.Controllers
{
    public class HomeController : Controller
    {
        private SportsProContext context { get; set; }

        public HomeController(SportsProContext ctx)
        {
            context = ctx;
        }

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult About()
        {
            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }
       ....
    }
}

ProductController:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using SportsPro.Models;

namespace SportsPro.Controllers
{
    public class ProductController : Controller
    {
        private SportsProContext context { get; set; }

        public ProductController(SportsProContext ctx)
        {
            context = ctx;
        }

        [HttpGet]
        public IActionResult Add()
        {
            ViewBag.Action = "Add";
            ViewBag.ProductCode = context.Products.OrderBy(p => p.Name).ToList();
            return View("Edit", new Product());
        }

        [HttpGet]
        public IActionResult Edit(int id)
        {
            ViewBag.Action = "Edit";
            ViewBag.ProductCode = context.Products.OrderBy(p => p.Name).ToList();
            var product = context.Products.Find(id);
            return View(product);
        }

        [HttpPost]
        public IActionResult Edit(Product product)
        {
            if (ModelState.IsValid)
            {
                if (product.ProductID == 0)
                    context.Products.Add(product);
                else
                    context.Products.Update(product);

                context.SaveChanges();
                return RedirectToAction("List", "Product");
            }
            else
            {
                ViewBag.Action = (product.ProductID == 0) ? "Add" : "Edit";
                ViewBag.ProductCode = context.Products.OrderBy(p => p.Name).ToList();
                return View(product);
            }
        }

        [HttpGet]
        public IActionResult Delete(int id)
        {
            var product = context.Products.Find(id);
            return View(product);
        }

        [HttpPost]
        public IActionResult Delete(Product product)
        {
            context.Products.Remove(product);
            context.SaveChanges();
            return RedirectToAction("List", "Product");
        }
    }
}

还有其他代码示例可以帮助解决我的问题吗?我觉得我的问题在于我的ProductController

【问题讨论】:

  • 你是如何导航的?您的 LIst 操作在哪里?
  • 这就是我卡住的地方 - 试图弄清楚如何在 ProductController 中实现 List,但我尝试了很多功能都没有成功。在我的学习经历阶段,我觉得我在泥泞中跋涉。所有来回、侧身和颠倒的呼唤有时会让我感到困惑。

标签: asp.net-mvc asp.net-core controller navigation visual-studio-2019


【解决方案1】:

据我了解,您想点击菜单栏上的产品按钮,然后转到您列出产品的页面。

<a class="nav-item nav-link active" asp-controller="Product" asp-action="List">Products</a>

上述代码的含义如下:转到您的产品控制器和该控制器的列出动作

要做到这一点,您首先必须在产品控制器中创建一个名为 List() 的函数。到目前为止,您的 Product 控制器中似乎没有一个名为 List() 的函数。

public async Task<IActionResult> List()
{
     var products = await context.Products.ToListAsync();
     return View(products);
}

创建 List 函数后,您应该将模型从控制器返回到您的 Views/Product/List.cshtml

然后您可以在视图中使用该模型,如下所示:

@model IEnumerable<Product>

<div>
    @foreach(var product in Model){
        <a>@product.Name</a>
    }
<div>

【讨论】:

  • 好吧,ProductController 中的函数很有意义(我知道我需要 'List',但不知道如何/在哪里),虽然我不熟悉使用 'async','任务”或“等待”。我对如何/在哪里使用“@foreach”代码也有些困惑。我尝试在列表视图中使用 is,但出现错误(CS1579 - foreach 语句无法对“产品”类型的变量进行操作,因为“产品”不包含“GetEnumerator”的公共实例或扩展定义),其中我还没有想出如何自己解决。
  • 嗨 @Alex,@foreach 代码应该在您的 Views/Product/List.cshtml 中,错误消息意味着您需要将 @Model Product 更改为 @Model List&lt;Product&gt;
  • 您现在可以删除“异步”、“任务”和“等待”。它们是线程相关的结构。你暂时不需要它们。 'foreach' 用于遍历集合中的项目。由于您的视图包含 Product (它是一个对象),因此 foreach 循环无法迭代。您应该将产品列表发送到列表视图,并将视图中的模型初始化为“@model IEnumerable”而不是“@model”产品。
  • @EmreUtkuSolak 谢谢你的澄清,这对我来说有点学习曲线。我在视图中更改了模型并添加了 foreach 代码,但现在收到错误 CS1061(“IEnumerable”不包含“Name”的定义...缺少 using 指令或程序集引用?))。我的控制器和模型似乎具有所有必要的 using 指令,所以我现在正试图弄清楚。
  • .Name 只是您实体中的一个示例属性。我举了一个例子。您可以将其替换为您的产品模型的属性。我你把“。”在“产品”之后,它将向您显示您的产品模型包含的可能属性。它可以是 @product.Name@product.Count@product.Id ...这完全取决于您的模型的属性和什么您想在视图中展示您的产品。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
相关资源
最近更新 更多