我正在嘗試提供一項服務來對頁面上的不同視圖進行 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 陳述句,但我想盡可能避免這種情況,因為它會使控制器變得混亂。
我有哪些選擇?
uj5u.com熱心網友回復:
查看源代碼,傳遞給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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/359400.html
標籤:C# asp.net-mvc asp.net-mvc-4
上一篇:htaccess非www不重定向
下一篇:谷歌圖如何在沒有資料時顯示空圖
