这是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);
}
答案 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
}