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

ASP.带有空值的.NET MVC属性路由

您可以使用单独的路由来实现这一点,或者将您的参数更改为可选。

当使用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}`);
  }