URL路由ASP Core MVC

时间:2020-04-17 00:02:22

标签: asp.net asp.net-mvc asp.net-core

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

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

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

下面是2个模型以及组织的view操作和当前都位于orgcontroller中的网站的viewsite操作

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

2 个答案:

答案 0 :(得分:1)

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

型号:

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

Startup.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?}");
    });
}

结果: enter image description here

请求网址: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属性:

[Route("[controller]/{id}/sites/{siteId}")]
public async Task<IActionResult> Details(Guid id,Guid? siteId )

答案 1 :(得分:0)

我最终完成的方式是

控制器

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


        }

Startup.cs

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