通过路由值将值传递给嵌套属性

时间:2019-01-23 11:37:46

标签: c# asp.net-core routes

我有一个带有嵌套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结构以某种方式无法正确绑定,因此我也更改了自己的类,使其更接近原始场景。对此表示歉意,我应该在发布问题之前检查一下。原始问题仍未更改。

编辑#2:

对于ASP.NET MVC 5,我发现了类似的question。@ ant-p answer建议使用RouteValueDictionary,然后将其传递给路由值。这并不完美,因为它涉及手动编写属性名称,而不必使用确切的属性名称进行绑定,例如用FromQueryAttribute注释时。

1 个答案:

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