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

Posted

技术标签:

【中文标题】params ViewResult[] 将相同的模型应用于作为参数传递的所有 ViewResult 实例【英文标题】:params ViewResult[] applying the same model to all instances of ViewResult passed as arguments 【发布时间】:2021-12-24 01:21:52 【问题描述】:

我正在尝试提供一项服务来对页面上的不同视图进行 AB 测试。该服务有一个方法,它采用可变数量的 ViewResults 并在确定要提供哪个版本后返回其中一个。问题是应用于参数列表中最后一个 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));

如果服务返回参数列表的索引 0,我希望得到例如带有 modelOne 的 _PageView.cshtml - 但不,我得到带有 modelThree 的 _PageView.cshtml。不知何故,模型是从最后一个条目中获取的,因为如果服务返回索引 1,我会得到带有 modelThree 的 _SomeOtherPageView.cshtml。

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

我有什么选择?

【问题讨论】:

您调用了 3 次只需要调用一次的方法,难怪您看到的结果没有意义。做任何你需要确定视图的事情,然后运行View(viewname, model)只运行一次 我不想与变量模型具有相同的视图名称,或者具有相同模型的变量视图名称,两者都应该作为组合对象进行变量。在不使用 View 组合它们的情况下,如何从一组中确定一个视图名称和模型组合?还是有我没有看到的完全不同的方法? 【参考方案1】:

查看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);

【讨论】:

以上是关于params ViewResult[] 将相同的模型应用于作为参数传递的所有 ViewResult 实例的主要内容,如果未能解决你的问题,请参考以下文章

ViewResult 和查找目录

如何在请求过滤器中的 ViewResult 上设置视图模型?

在 ASP.NET MVC 3 中创建基于平台显示不同视图的自定义 ViewResult

索引ViewResult在从ajax调用回调后不重新呈现

matlab里,有没有函数直接求一个矢量的模

ASP.NET MVC 4 视图