asp.net - 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);
}
解决方案
这是一个工作演示,如下所示:
模型:
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 )
推荐阅读
- java - 访问 (JUnit) Localstack 日志
- kotlin - 将 println 用于类实例时,Kotlin 奇怪的输出
- c# - 如何在泛型类型之间进行转换
- c# - 为什么 nameof 不能与 CreationAtAction return 语句一起使用
- c# - 如何计算列表中的每个整数单独的整数
- git - Git pull - 设备上没有剩余空间错误,剩余可用空间
- python - Python 2.7:根据 2 个字典列表中的一个键值查找常用元素
- pyspark - 与 show 方法或计数一起使用时,jupyter 单元执行挂起并引发异常
- javascript - Vuex中数组对象的反应式设置器的最佳实践是什么?
- deep-learning - 可以在两个权重矩阵之间添加非线性函数吗?