ASP.带有空值的.NET MVC属性路由
本文关键字:MVC 属性 路由 NET 空值 ASP | 更新日期: 2023-09-27 18:02:17
这是在EverythingController中的动作方法MovieCustomer的粘贴。视图模型用于组合两个模型:Customer &电影,并通过ApplicationDbContext (_context)填充来自数据库的信息。
路由工作成功,并在MovieId和CustomerId有值时呈现页面
。/一切/MovieCustomer/1/1
我希望页面也加载,如果一个或两个值为空。到目前为止,两个int形参都是可空的,如果其中一个为空,方法中有一个if语句将参数更改为1。到目前为止,如果值为空,浏览器将返回404错误。
当一个或其中一个参数为空时,如何使页面正常工作?由于
[Route("Everything/MovieCustomer/{movieId}/{customerId}")]
public ActionResult MovieCustomer(int? movieId, int? customerId)
{
var viewmodel = new ComboViewModel
{
_Customers = new List<Customer>(),
_Movies = new List<Movies>(),
_customer = new Customer(),
_movie = new Movies()
};
viewmodel._Customers = _context.Customers.ToList();
viewmodel._Movies = _context.Movies.ToList();
if (!movieId.HasValue)
movieId = 1;
if (!customerId.HasValue)
customerId = 1;
viewmodel._customer = viewmodel._Customers.SingleOrDefault(a => a.Id == customerId);
viewmodel._movie = viewmodel._Movies.SingleOrDefault(a => a.Id == movieId);
return View(viewmodel);
}
您可以使用单独的路由来实现这一点,或者将您的参数更改为可选。
当使用3个属性时,您可以为您拥有的每个选项添加单独的路由-当未指定参数时,仅指定movieId
时,以及指定所有3个参数时。
[Route("Everything/MovieCustomer/")]
[Route("Everything/MovieCustomer/{movieId}")]
[Route("Everything/MovieCustomer/{movieId}/{customerId}")]
public ActionResult MovieCustomer(int? movieId, int? customerId)
{
// the rest of the code
}
或者你可以将你的路由参数更改为可选的(通过在路由定义中添加?
),这应该涵盖所有3种情况:
[Route("Everything/MovieCustomer/{movieId?}/{customerId?}")]
public ActionResult MovieCustomer(int? movieId, int? customerId)
{
// the rest of the code
}
请记住,这两个示例都不支持只提供customerId
的情况。
请记住,这两个示例都不支持只提供customerId的情况。
看看。如果你想只提供customerId:
,我认为你可以使用多路由方法,甚至像这样的另一个路由。[Route("Everything/MovieCustomer/null/{customerId}")]
有趣的是,我还必须在签名中添加可选参数,以便它在Angular客户端中工作,如下所示:
[HttpGet]
[Route("IsFooBar/{movieId?}/{customerId?}")]
[Route("IsFooBar/null/{customerId?}")]
public bool IsFooBar(int? movieId = null, int? customerId = null)
{
// the rest of the code
}
在Angular中
public IsFoobar(movieId: number | null, customerId: number | null): Observable<boolean> {
return this.httpService.get<boolean>(`api/IsFooBar/${movieId}/${customerId}`);
}