如何解决如何单击客户名称,然后在actionResult中仅显示其名称?
现在,我正在运行这个MVC项目。我有一个包含两个客户的表,这些客户被硬编码到表中,而没有使用数据库。下面的两个图像显示了当您单击一位客户时应该发生的情况。在显示该客户的ID时,它将使用操作结果“详细信息”拉出以下URL“ Customers / Details / 1”。由于只有两个客户,因此如果将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 }
);
}
}
}
解决方法
有点问题是您正在对内容进行硬编码,而不是将其存储在某个地方,但是为了示例,我将做同样的事情。
首先,在控制器顶部,添加以下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教程,因为您似乎目前缺少一些基本知识。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。