По сути, я хочу добавить этот помощник в Razor.То, что я пробовал:
public static class Html
{
static Dictionary<string[], int> _cycles;
static Html()
{
_cycles = new Dictionary<string[], int>();
}
public static string Cycle(this HtmlHelper helper, string[] options)
{
if (!_cycles.ContainsKey(options)) _cycles.Add(options, 0);
int index = _cycles[options];
_cycles[options] = (options.Length + 1) % options.Length;
return options[index];
}
Использование:
<tr class="@Html.Cycle(new[]{"even","odd"})">
Но он просто говорит "даже" для каждого ряда ... не знаю почему.Я не уверен, когда создается экземпляр этого класса ..... это один раз для запроса, один раз для запуска сервера ... или что?Независимо от того ... как бы я исправить это так, чтобы он дал предполагаемое чередование?
Попытка # 2
public static class Html
{
public static string Cycle(this HtmlHelper helper, params string[] options)
{
if(!helper.ViewContext.HttpContext.Items.Contains("cycles"))
helper.ViewContext.HttpContext.Items["cycles"] = new Dictionary<string[],int>(new ArrayComparer<string>());
var dict = (Dictionary<string[], int>)helper.ViewContext.HttpContext.Items["cycles"];
if (!dict.ContainsKey(options)) dict.Add(options, 0);
int index = dict[options];
dict[options] = (index + 1) % options.Length;
return options[index];
}
}
class ArrayComparer<T> : IEqualityComparer<T[]>
{
public bool Equals(T[] x, T[] y)
{
if (ReferenceEquals(x, y)) return true;
if (x == null || y == null) return false;
if (x.Length != y.Length) return false;
for (int i = 0; i < x.Length; ++i)
if (!x[i].Equals(y[i])) return false;
return true;
}
public int GetHashCode(T[] obj)
{
return obj.Length > 0 ? obj[0].GetHashCode() : 0;
}
}
Любая проблема с этим?