Необходимо хранить статическое значение на время запроса. Как?
У меня есть приложение ASP.NET MVC. Я пришел к мысли о создании автоинкрементных значений для использования в качестве уникальных идентификаторов элементов. Вопрос в том, как я могу иметь глобальную переменную и работать с ней, которая должна присутствовать на протяжении всего запроса (генерация страницы), но больше не должна?
Я думал об использовании TempData для этой общей переменной, а затем просто удаляю этот ключ, когда страница готова. Но тогда, где в коде удалить этот ключ TempData? Очевидно, что это должен быть какой-то последний кусок кода, где страница уже отрисована.
Любой вклад высоко ценится.
РЕДАКТИРОВАТЬ: У меня есть несколько помощников HTML, которые могут вызываться из различных представлений и частичных представлений, поэтому объявление переменной на странице и передача ее каждому помощнику, очевидно, не является хорошим решением. Я хочу просто использовать помощников и знать, что все они получают уникальные идентификаторы за кулисами.
5 ответов
Хорошо, я немного погуглил и нашел решение на форумах ASP.NET.
http://forums.asp.net/t/1401685.aspx
Очевидно, я могу использовать коллекцию HttpContext.Current.Items, чтобы иметь мою маленькую статическую переменную на время запроса.
Почему бы вам не определить целочисленную переменную в верхней части файла просмотра страницы? Используйте его во время выполнения рендеринга представления, и в конце вы можете легко оставить все как есть. Вам не нужно ничего явно уничтожать. Ваши переменные живут только на время запроса. IIS - это служба без сохранения состояния (если вы вычесть переменные Session, Cache и Application), поэтому он ничего не помнит явно.
Я полагаю, вы могли бы использовать методы Application_BeginRequest и Application_EndRequest в global.asax.cs; Обратите внимание, что я не могу дважды проверить имена методов, но я думаю, что они близки.
Вы можете создать переменную-член в вашем контроллере, которая будет генерироваться для каждого запроса:
public class ItemController : Controller
{
private int _UniqueID = 0;
public ActionResult Index()
{
foreach (var item in items)
{
item.UniqueID = _UniqueID++;
}
// etc...
}
Если все, что вам нужно, это сохранить число, то ресурсы, которые потребуются для управления его образом жизни, потребуют намного больше, чем просто наличие одного статического целого числа и его повторное использование.
Не беспокойтесь об удалении ключа после каждого запроса. Просто используйте статическое (я думаю, это общее в Visual Basic) целое число, используйте и увеличивайте его каждый раз, когда вам нужно уникальное значение. Также возьмите его мод со смехотворно большим числом каждый раз, чтобы убедиться, что он не будет повторно использован в одном запросе и никогда не будет переполнен.