Asp.net URL路由ASP核心MVC

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

我有两个模型。组织和网站。一个组织可以有多个站点,但一个站点只能有一个组织。我已经能够成功地创建一个页面,您可以创建一个组织及其主站点,所有保存到数据库的罚款

我想做的是有一个页面,显示一个组织的所有网站。我希望url类似于~/Organizations/6/Sites。要查看特定站点上的信息,url应为~/organizations/6/sites/2

我将如何实现这一目标?谁能给我指一下正确的方向吗。我的理解是,这将在startup.cs文件下的endpoints.mapcontrolleroute部分中完成

下面是组织的两个模型和查看操作,以及当前都位于orgcontroller中的站点的查看站点操作

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