【发布时间】: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 组合它们的情况下,如何从一组中确定一个视图名称和模型组合?还是有我没有看到的完全不同的方法?
标签: c# asp.net-mvc asp.net-mvc-4