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

时间:2016-08-14 15:25:29

标签: c# asp.net asp.net-mvc

这是EverythingController中动作方法MovieCustomer的粘贴。 Viewmodel用于组合两种型号:Customer&电影,并通过ApplicationDbContext(_context)填充来自数据库的信息。

当有MovieId和CustomerId值

时,路由成功运行并呈现页面

e.g。 /一切/ MovieCustomer / 1/1

如果其中一个或两个值为null,我希望页面也加载。到目前为止,两个int参数都是可空的,并且在方法中有一个if语句,如果其中任何一个为null,则将参数更改为1。 到目前为止,如果值为null,则浏览器返回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);
}

2 个答案:

答案 0 :(得分:7)

您可以使用单独的路线实现此目的,或将您的参数更改为可选参数。

使用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

的情况

答案 1 :(得分:0)

有趣的是,我还必须向签名添加可选参数,以便它可以从Angular客户端像这样工作:

>>> def f(foo):
...     return foo
...
>>> apply(f, {'foo': 2, 'bar': 3})
2
>>> apply(f, {'baz': 2, 'bar': 3})
…
TypeError: f() missing 1 required positional argument: 'foo'

在角

[HttpGet]
[Route("IsFooBar/{movieId?}/{customerId?}")]
[Route("IsFooBar/null/{customerId?}")]
public bool IsFooBar(int? movieId = null, int? customerId = null)
{
    // the rest of the code
}