【问题标题】:How can I click on a customer's name and present just their name in an actionResult?如何单击客户的姓名并在 actionResult 中仅显示他们的姓名?
【发布时间】:2021-01-15 11:33:30
【问题描述】:

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

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 }
                );
            }
        }
    }

【问题讨论】:

  • 您能发布details 操作的真实代码吗?您显示的内容无法编译。
  • 那是真正的代码,我不知道该为那个actionResult放什么
  • 我认为我的 actionResult 详细信息和路线配置有问题

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

一个问题是你在硬编码东西,而不是把东西存储在某个地方,但为了一个例子,我会做同样的事情。

首先,在控制器的顶部,添加以下 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 是您的控制器的名称,details 是您的操作名称,它们都定义了一个 id 参数。这意味着该路由已经与默认的"{controller}/{action}/{id}" 路由匹配,因此您不需要您的Customers 路由。

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

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

不过,在这一点上,我强烈建议您阅读一些 MVC 教程,因为您目前似乎缺少一些基础知识。

【讨论】:

  • @Soccerplayer97 让我稍微更新一下我的答案,向您展示它应该在哪里 - 在评论中格式化有点困难。
  • 我相信我已经找到了正确的解决方案,几天前我能够完成一些教程。我的路线根本不需要修改,我需要为我的客户和电影视图创建单独的视图模型。有没有办法可以与您分享我的源代码,或者我必须编辑这篇文章?
  • @Soccerplayer97 对于迟到的回复,我真的很抱歉 - 这是艰难的一周。对于这样的问题,您可以在 codereview.stackexchange.com 上发帖。这样,您就可以从多个来源获得反馈。
猜你喜欢
  • 2021-08-06
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2013-09-22
  • 1970-01-01
相关资源
最近更新 更多