Asp.net URL路由ASP核心MVC
我有两个模型。组织和网站。一个组织可以有多个站点,但一个站点只能有一个组织。我已经能够成功地创建一个页面,您可以创建一个组织及其主站点,所有保存到数据库的罚款 我想做的是有一个页面,显示一个组织的所有网站。我希望url类似于~/Organizations/6/Sites。要查看特定站点上的信息,url应为~/organizations/6/sites/2 我将如何实现这一目标?谁能给我指一下正确的方向吗。我的理解是,这将在startup.cs文件下的endpoints.mapcontrolleroute部分中完成 下面是组织的两个模型和查看操作,以及当前都位于orgcontroller中的站点的查看站点操作Asp.net URL路由ASP核心MVC,asp.net,asp.net-mvc,asp.net-core,Asp.net,Asp.net Mvc,Asp.net Core,我有两个模型。组织和网站。一个组织可以有多个站点,但一个站点只能有一个组织。我已经能够成功地创建一个页面,您可以创建一个组织及其主站点,所有保存到数据库的罚款 我想做的是有一个页面,显示一个组织的所有网站。我希望url类似于~/Organizations/6/Sites。要查看特定站点上的信息,url应为~/organizations/6/sites/2 我将如何实现这一目标?谁能给我指一下正确的方向吗。我的理解是,这将在startup.cs文件下的endpoints.mapcontroller
public class Organization:BaseEntity
{
[Required]
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "Logo")]
public string Logo { get; set; }
[Required]
[Display(Name = "Type")]
public OrganizationType Type { get; set; }
[DataType(DataType.DateTime)]
public DateTime CreatedDate { get; set; }
[DataType(DataType.DateTime)]
public DateTime ModifiedDate { get; set; }
public int Demo { get; set; }
[Required]
public bool Active { get; set; }
public virtual ICollection<Contact> Contacts { get; set; }
public virtual ICollection<Site> Sites { get; set; }
}
public class Site : BaseEntity
{
[Required]
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "Address")]
public string FullAddress
{
get
{
return StreetNumber + " " + StreetAddress + " " + Suburb + " " + State + " " + PostCode + " " + Country;
}
}
[Required]
[Display(Name = "Street Number")]
public string StreetNumber { get; set; }
[Required]
[Display(Name = "Street Address")]
public string StreetAddress { get; set; }
[Required]
[DataType(DataType.PostalCode)]
[Display(Name = "Postcode")]
public string PostCode { get; set; }
[Required]
[Display(Name = "Suburb")]
public string Suburb { get; set; }
[Required]
[Display(Name = "State")]
public string State { get; set; }
[Required]
[Display(Name = "Country")]
public string Country { get; set; }
[Required]
[DataType(DataType.PhoneNumber)]
[Display(Name = "Phone Number")]
public string PhoneNumber { get; set; }
[DataType(DataType.DateTime)]
public DateTime CreatedDate { get; set; }
[DataType(DataType.DateTime)]
public DateTime ModifiedDate { get; set; }
[Required]
public bool IsPrimary { get; set; }
public int Demo { get; set; }
[Required]
public bool Active { get; set; }
[Display(Name = "Image")]
public string Image { get; set; }
public virtual Organization Organization { get; set; }
}
// GET: Organizations/View/5
public async Task<IActionResult> View(Guid? id)
{
if (id == null)
{
return NotFound();
}
var organization = _context.Organizations.Include("Sites").Include("Contacts").FirstOrDefault(x=> x.ID == id);
ViewBag.SiteCount = organization.Sites.Count;
ViewBag.ContactCount = organization.Contacts.Count;
if (organization == null)
{
return NotFound();
}
return View(organization);
}
// GET: Organizations/View/5
public async Task<IActionResult> ViewSites(Guid? id)
{
if (id == null)
{
return NotFound();
}
List<Site> sites = _context.Organizations.Include("Sites").Where(x=>x.ID == id).ToList().FirstOrDefault().Sites.ToList();
return View(sites);
}
公共类组织:BaseEntity
{
[必需]
[显示(Name=“Name”)]
公共字符串名称{get;set;}
[显示(Name=“Logo”)]
公共字符串标志{get;set;}
[必需]
[显示(Name=“Type”)]
公共组织类型类型{get;set;}
[数据类型(数据类型.日期时间)]
公共日期时间CreatedDate{get;set;}
[数据类型(数据类型.日期时间)]
公共日期时间修改日期{get;set;}
公共int Demo{get;set;}
[必需]
公共bool活动{get;set;}
公共虚拟ICollection联系人{get;set;}
公共虚拟ICollection站点{get;set;}
}
公共类站点:BaseEntity
{
[必需]
[显示(Name=“Name”)]
公共字符串名称{get;set;}
[显示(Name=“Address”)]
公共字符串完整地址
{
得到
{
返回街道号+街道地址+郊区+州+邮编+国家;
}
}
[必需]
[显示(名称=“街道编号”)]
公共字符串StreetNumber{get;set;}
[必需]
[显示(Name=“街道地址”)]
公共字符串StreetAddress{get;set;}
[必需]
[数据类型(DataType.PostalCode)]
[显示(Name=“Postcode”)]
公共字符串邮政编码{get;set;}
[必需]
[显示(Name=“郊区”)]
公共字符串{get;set;}
[必需]
[显示(Name=“State”)]
公共字符串状态{get;set;}
[必需]
[显示(Name=“Country”)]
公共字符串国家{get;set;}
[必需]
[数据类型(数据类型.电话号码)]
[显示(Name=“电话号码”)]
公共字符串PhoneNumber{get;set;}
[数据类型(数据类型.日期时间)]
公共日期时间CreatedDate{get;set;}
[数据类型(数据类型.日期时间)]
公共日期时间修改日期{get;set;}
[必需]
公共bool IsPrimary{get;set;}
公共int Demo{get;set;}
[必需]
公共bool活动{get;set;}
[显示(Name=“Image”)]
公共字符串图像{get;set;}
公共虚拟组织{get;set;}
}
//获取:组织/View/5
公共异步任务视图(Guid?id)
{
if(id==null)
{
返回NotFound();
}
var organization=_context.Organizations.Include(“站点”).Include(“联系人”).FirstOrDefault(x=>x.ID==ID);
ViewBag.SiteCount=organization.Sites.Count;
ViewBag.ContactCount=organization.Contacts.Count;
if(组织==null)
{
返回NotFound();
}
返回视图(组织);
}
//获取:组织/View/5
公共异步任务查看站点(Guid?id)
{
if(id==null)
{
返回NotFound();
}
列出站点=_context.Organizations.Include(“站点”)。其中(x=>x.ID==ID.ToList().FirstOrDefault().sites.ToList();
返回视图(站点);
}
以下是一个工作演示:
型号:
public class BaseEntity
{
public Guid Id { get; set; }
}
public class Organization : BaseEntity
{
[Required]
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "Logo")]
public string Logo { get; set; }
[DataType(DataType.DateTime)]
public DateTime CreatedDate { get; set; }
[DataType(DataType.DateTime)]
public DateTime ModifiedDate { get; set; }
public int Demo { get; set; }
[Required]
public bool Active { get; set; }
public virtual ICollection<Site> Sites { get; set; }
}
public class Site : BaseEntity
{
[Required]
[Display(Name = "Name")]
public string Name { get; set; }
[Display(Name = "Address")]
public string FullAddress
{
get
{
return StreetNumber + " " + StreetAddress + " " + Suburb + " " + State + " " + PostCode + " " + Country;
}
}
[Required]
[Display(Name = "Street Number")]
public string StreetNumber { get; set; }
[Required]
[Display(Name = "Street Address")]
public string StreetAddress { get; set; }
[Required]
[DataType(DataType.PostalCode)]
[Display(Name = "Postcode")]
public string PostCode { get; set; }
[Required]
[Display(Name = "Suburb")]
public string Suburb { get; set; }
[Required]
[Display(Name = "State")]
public string State { get; set; }
[Required]
[Display(Name = "Country")]
public string Country { get; set; }
[Required]
[DataType(DataType.PhoneNumber)]
[Display(Name = "Phone Number")]
public string PhoneNumber { get; set; }
[DataType(DataType.DateTime)]
public DateTime CreatedDate { get; set; }
[DataType(DataType.DateTime)]
public DateTime ModifiedDate { get; set; }
[Required]
public bool IsPrimary { get; set; }
public int Demo { get; set; }
[Required]
public bool Active { get; set; }
[Display(Name = "Image")]
public string Image { get; set; }
public virtual Organization Organization { get; set; }
}
结果:
请求url:
更新:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "custom",
pattern: "Organizations/{id?}/{sites}/{siteId?}",
defaults: new { controller = "Organizations", action = "Details" });
});
或者,一种简单的方法是使用路由属性:
[Route("[controller]/{id}/sites/{siteId}")]
public async Task<IActionResult> Details(Guid id,Guid? siteId )
[Route(“[controller]/{id}/sites/{siteId}”)]
公共异步任务详细信息(Guid id、Guid?站点id)
我最终的做法是
控制器
// GET: Organizations/5
// GET: Organizations
[Route("[controller]/{id?}")]
public async Task<IActionResult> View(int? id)
{
if (id == 0)
{
return NotFound();
}
if (id == null)
{
return View("ViewAll",await _context.Organizations.Include("Sites").Include("Contacts").ToListAsync());
}
var organization = _context.Organizations.Include("Sites").Include("Contacts").FirstOrDefault(x=> x.ID == id);
if (organization == null)
{
return NotFound();
}
return View("View",organization);
}
// GET: Organizations/5/Sites/2
// GET: Organizations/5/Sites
// GET: Organizations/5
[Route("[controller]/{id}/sites/{siteId?}")]
public async Task<IActionResult> ViewSites(int ordId, int? siteId)
{
if (ordId == 0)
{
return NotFound();
}
if (siteId == 0)
{
List<Site> sites = _context.Organizations.Include("Sites").Where(x => x.ID == ordId).ToList().FirstOrDefault().Sites.ToList();
return View("ViewSites",sites);
}
Site site = _context.Organizations.Include("Sites").Where(x => x.ID == ordId).ToList().FirstOrDefault().Sites.ToList().Where(y=>y.ID == siteId).FirstOrDefault();
return View("ViewSite", site);
}
为了这个打安斯克。请检查我的答案。如果我的答案对您有帮助,您可以吗?谢谢。
public async Task Details(Guid?Id,Guid siteId)
应该是(Guid Id,Guid?siteId)
如果(siteId==0)
应该是如果(siteId.HasValue)&&siteId==0
如果sideid为空,您的代码将抛出。虽然IMHO,if(siteId.HasValue)&&siteId==default(int))
更准确地表达了您的意图。检索单个站点应简化为site-site=\u context.Sites.Where(s=>s.ID==siteId.FirstOrDefault()代码>
[Route("[controller]/{id}/sites/{siteId}")]
public async Task<IActionResult> Details(Guid id,Guid? siteId )
// GET: Organizations/5
// GET: Organizations
[Route("[controller]/{id?}")]
public async Task<IActionResult> View(int? id)
{
if (id == 0)
{
return NotFound();
}
if (id == null)
{
return View("ViewAll",await _context.Organizations.Include("Sites").Include("Contacts").ToListAsync());
}
var organization = _context.Organizations.Include("Sites").Include("Contacts").FirstOrDefault(x=> x.ID == id);
if (organization == null)
{
return NotFound();
}
return View("View",organization);
}
// GET: Organizations/5/Sites/2
// GET: Organizations/5/Sites
// GET: Organizations/5
[Route("[controller]/{id}/sites/{siteId?}")]
public async Task<IActionResult> ViewSites(int ordId, int? siteId)
{
if (ordId == 0)
{
return NotFound();
}
if (siteId == 0)
{
List<Site> sites = _context.Organizations.Include("Sites").Where(x => x.ID == ordId).ToList().FirstOrDefault().Sites.ToList();
return View("ViewSites",sites);
}
Site site = _context.Organizations.Include("Sites").Where(x => x.ID == ordId).ToList().FirstOrDefault().Sites.ToList().Where(y=>y.ID == siteId).FirstOrDefault();
return View("ViewSite", site);
}
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "OrgSites",
pattern: "Organizations/{id}/{sites}/{siteId?}",
defaults: new { controller = "Organizations", action = "ViewSites" });
endpoints.MapControllerRoute(
name: "Orgs",
pattern: "Organizations/{id?}",
defaults: new { controller = "Organizations", action = "View" });
endpoints.MapControllerRoute(
name: "Orgs",
pattern: "Organizations",
defaults: new { controller = "Organizations", action = "View" });
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});