首页 > 解决方案 > URL 路由 ASP Core MVC

问题描述

我有 2 个模型。组织和站点。一个组织可以有多个站点,但一个站点只能有 1 个组织。我已经能够成功创建一个页面,您可以使用其主站点创建一个组织,并将所有内容都保存到数据库中。

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

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

以下是 2 个模型和 org 的 view 操作以及当前都驻留在 orgcontroller 中的站点的 viewsites 操作

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

标签: asp.netasp.net-mvcasp.net-core

解决方案


这是一个工作演示,如下所示:

模型:

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

控制器:

public class OrganizationsController : Controller
{
    private readonly YourDbContext _context;

    public OrganizationsController(YourDbContext context)
    {
        _context = context;
    }

    // GET: Organizations/Details/5
    public async Task<IActionResult> Details(Guid? id,Guid siteId )
    {
        if (id == null)
        {
            return NotFound();
        }

        var organization = await _context.Organization.Include(o=>o.Sites)
            .FirstOrDefaultAsync(m => m.Id == id);
        var site = organization.Sites.Where(x => x.Id == siteId).FirstOrDefault();

        return View(site);
    }
}

启动.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}/{siteId?}");
    });
}

结果: 在此处输入图像描述

请求网址:https://localhost:portNumber/Organizations/Details/orgnizationid/siteid

更新:

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 )

推荐阅读