如何单击客户的姓名并在 actionResult 中只显示他们的姓名?

How can I click on a customer's name and present just their name in an actionResult?

现在,有了这个 MVC 项目,我 运行。我有一个 table 的两个客户,他们在不使用数据库的情况下被硬编码到 table 中。下面的两张图片显示了当您单击其中一位客户时应该发生的情况。它将使用操作结果详细信息拉出以下 URL“Customers/Details/1”,同时显示该客户的 ID。由于只有两个客户,如果将 url 更改为“Customers/Details/3”,则会出现 return HttpNotFound 错误。我包含了我的客户控制器、table 的视图模型和路由配置文件。当我点击其中一位客户时,我得到“未找到视图 'details' 或其主视图,或者没有视图引擎支持搜索的位置。搜索了以下位置:”。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WebApplication1.Models;
using WebApplication1.ViewModels;

namespace WebApplication1.Controllers
{
    public class CustomerController : Controller
    {
        
        // GET: customer/getCustomer
        public ActionResult Index() 
        {
           
           
               //Create instance of movie
                
            var customers = new List<Customer>
            {
                new Customer {Name = "John Smith"},
                new Customer {Name = "Jane Doe"}
            };

            var viewModel = new RandomMovieViewModel
            {
                 Customers = customers
            };
                return View(viewModel);

         }
        
       public ActionResult details(int id)
       {
            

            if (customers == null)
               return HttpNotFound();
            else
                return View(viewModel);





        } 
    }
}
@model WebApplication1.ViewModels.RandomMovieViewModel
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Customers</h2>
@if (Model.Customers.Count == 0)
{
    <text>There are no customers</text>
}
else 
{
<table id="customers" class="table table-bordered table-hover">
    <thead>
        <tr>
            <th>Customer</th>
        </tr>
        <tr>
    </thead>
    <tbody>
        @foreach (var customer in Model.Customers)
        {
            <tr>
                <td>@Html.ActionLink(customer.Name, "details", new {id = 1 }, null)</td>
            </tr>
        }
    </tbody>
</table>
}

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Routing;
    
    namespace WebApplication1
    {
        public class RouteConfig
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
                routes.MapRoute(
                     "Customers",
                     "Customer/details/{id}",
                     new { controller = "Customer", action = "details", id = UrlParameter.Optional }
                );
    
                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                );
            }
        }
    }

有点问题是您正在对事物进行硬编码,而不是将事物存储在某个地方,但为了举例,我会做同样的事情。

首先,在控制器的顶部,添加以下 using 指令:

using System.Linq;

将您的操作更改为:

public IActionResult Details(int id)
{
    // Remember that this is a different copy of the list
    // to the one in the Index action.
    var customers = new List<Customer>
    {
        // Notice I've added an Id property.
        new Customer { Id = 1, Name = "John Smith"},
        new Customer { Id = 2, Name = "Jane Doe"}
    };

    // Attempt to find a customer whose Id property is
    // equal to the id passed to the action.
    // SingleOrDefault() states that we expect to find only
    // one match if there is one, and if there isn't, it'll return `null`.
    var customer = customers
        .Where(x => x.Id == id)
        .SingleOrDefault();

    if (customer == null)
    {
        // Alternatively, you could return RedirectToAction("Index");
        return NotFound();
    }

    var viewModel = new CustomerViewModel
    {
        Customer = customer;
    };

    return View(viewModel);
} 

最后,看看你定义的路由:

"Customer/details/{id}"
"{controller}/{action}/{id}"

注意,Customer是你的controller的名字,details是你的action的名字,它们都定义了一个id参数。这意味着该路由已经与默认 "{controller}/{action}/{id}" 路由匹配,因此您不需要 Customers 路由。

关于您对详细信息视图的评论,您的文件夹结构应如下所示:

Views
  \ Home
     \ Index.cshtml
  \ Customer
     \ Index.cshtml
     \ Details.cshtml

虽然在这一点上,我强烈建议您完成一些 MVC 教程,因为您目前似乎缺少一些基础知识。