params ViewResult[] 将相同的模型应用于作为参数传递的所有 ViewResult 实例

params ViewResult[] applying the same model to all instances of ViewResult passed as arguments

我正在尝试提供一项服务来对页面上的不同视图进行 AB 测试。该服务有一个方法,在确定要服务的版本后,它会获取可变数量的 ViewResults 和 returns 其中之一。问题是应用于参数列表中最后一个 ViewResult 的模型应用于所有参数。下面的代码是我的代码的简化版本,只是为了说明设置:

这是服务中的方法:

public ViewResult GetTestVariantView(params ViewResult[] views){

    ...omitted randomization code that returns an index

    return views[index] ?? views[0]
}

在控制器中是这样使用的:

public ActionResult Index(){
    var modelOne = new PageViewModel(letter: "A");
    var modelTwo = new PageViewModel(letter: "B");
    var modelThree = new PageViewModel(letter: "C");

    return _testingService.GetTestVariantView(
        View("~/Views/_PageView.cshtml", modelOne),
        View("~/Views/_SomeOtherPageView.cshtml", modelTwo ),
        View("~/Views/_PageView.cshtml", modelThree));
}

如果参数列表的服务 returns 索引 0,我希望通过 modelOne 获得例如 _PageView.cshtml - 但不,我通过 modelThree 获得 _PageView.cshtml。不知何故,只是模型取自最后一个条目,因为如果服务 returns 索引 1 我得到 _SomeOtherPageView.cshtml with modelThree.

我找不到任何文档或关于如何解决这个问题甚至以其他方式解决的类似问题。是否有更合适的方法来确定使用外部方法呈现哪个视图?我知道我可以 return 方法中的索引并在控制器中有一个 switch/ifelse 语句,但我想尽可能避免这种情况,因为它会使控制器混乱。

我有哪些选择?

查看 the source code,传递给 View 方法的模型存储在 ViewData 集合中,而不是返回的 ViewResult。如果使用不同的非空模型多次调用 View,每次都会覆盖 ViewData.Model 属性,并且只会使用最后一个值。

正如 Camilo 所说,更改您的代码,以便您只调用 View 一次。例如:

public (string viewName, object model) GetTestVariantView(
    params (string viewName, object model)[] views)
{
    ...
}
(string viewName, object model) = _testingService.GetTestVariantView(
    ("~/Views/_PageView.cshtml", modelOne),
    ("~/Views/_SomeOtherPageView.cshtml", modelTwo ),
    ("~/Views/_PageView.cshtml", modelThree));

return View(viewName, model);