我有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);
}
答案 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?}");
});
}
请求网址: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();
});