.net核心ViewModel提供路由参数

时间:2018-08-22 06:39:49

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

我有一个viewmodel类,该类具有许多不同的路由参数作为其属性。

public class FiltersVM
{
    public string parmOne {get; set;}
    public string parmTwo {get; set;}
    public string parmThree {get; set;}
    //etc
}

在我的控制器上,当我通过匹配的名称(例如:

)发送这些参数时,它们会正确使用这些参数
<a asp-route-parmOne="Hello" asp-route-parmTwo="Dave" asp-action="Index">Link</a>

这是控制器的一个示例(一部分):

public async Task<IActionResult> Index(FiltersVM filtersVM, List<string> messages, string searchString)            
{
    //do something with filtersVM.parmOne etc <--This works
}

问题: 当我从一个动作转到另一个动作

public async Task<IActionResult> QuickTask(FiltersVM filtersVM, List<string> messages, string searchString)            
{
    //do something with filtersVM.parmOne etc <-- this works

    Return RedirectToAction(nameof(Index), new { filtersVM});
}

这会将我发送回Index控制器,但不会将ViewMOdel分解为各个部分进行路由。我的网址返回如下:

https://localhost:44398/{ControllerName}?filtersVM=ProjectName.ViewModels.FiltersVM&{other route parameters not included in Viewmodel}

因此,第二个控制器正确地使用了VM参数来完成其工作,但是当它完成并尝试重定向时会出现问题。有什么想法吗?

我正试图避免创建这样的重定向。我没有尝试过,但是我敢打赌它会起作用,我有很多参数,所以这不是理想的选择:

Return RedirectToAction(nameof(Index), new { parmOne = filtersVM.parmOne, parmTwo = filtersVM.parmTwo, parmThree = filtersVM.parmThree });

1 个答案:

答案 0 :(得分:1)

filtersVM已经是一个对象,所以它只是

return RedirectToAction(nameof(Index),filtersVM);

它将正确地将模型的每个属性序列化为查询字符串。

但是请注意,该方法使用.ToString()序列化属性-无法正确序列化复杂对象或集合的属性。