如何单击客户的姓名并在 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 教程,因为您目前似乎缺少一些基础知识。
现在,有了这个 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 教程,因为您目前似乎缺少一些基础知识。