我有一个带有嵌套Size
对象的视图模型:
public class RedirectViewModel
{
public Size Size { get; set; }
}
尺寸等级:
public class Size
{
public int Height { get; set; }
public int Width { get; set; }
}
我希望Size
对象的属性由我通过重定向传递的路由值填充。
public class HomeController : Controller
{
public IActionResult Index()
{
return RedirectToAction(nameof(Redirect), new { Size = new { Width = 20, Height = 40 } } );
}
public IActionResult Redirect([FromRoute] RedirectViewModel viewModel)
{
return View(viewModel);
}
}
我从中得到的是带有查询参数的重定向URL:
?Size =%7B%20Width%20%3D%2020,%20Height%20%3D%2040%20%7D
URL解码后的来源:
?Size = {宽度= 20,高度= 40}
是的,空格也在那里,为了清楚起见,我没有添加它们。
遗憾的是,这不起作用。没有属性被填充。但是,如果我手动输入以这种方式编写的参数:
?Size.Width = 20&Size.Height = 40
然后,模型绑定器将成功识别它们,并设置相应的属性,与前面提到的URL相对。
我不想手动调整查询参数以使其正常工作。
如何为嵌套对象的属性构造路线值,以便模型联编程序能够识别它们?
为减轻对问题的轻描淡写,我没有使用确切的对象。我在原始代码示例中使用的Size结构以某种方式无法正确绑定,因此我也更改了自己的类,使其更接近原始场景。对此表示歉意,我应该在发布问题之前检查一下。原始问题仍未更改。
对于ASP.NET MVC 5,我发现了类似的question。@ ant-p answer建议使用RouteValueDictionary,然后将其传递给路由值。这并不完美,因为它涉及手动编写属性名称,而不必使用确切的属性名称进行绑定,例如用FromQueryAttribute注释时。
答案 0 :(得分:0)
只需执行以下操作:
public class HomeController : Controller
{
public IActionResult Index()
{
return Redirect(new Size() { Width = 20, Height = 40 } );
}
public IActionResult Redirect(Size size)
{
return View(size);
}
}