У меня есть веб-сайт MVC 5, который использует Entity Framework для взаимодействия с базами данных.Можно ли использовать IEnumerable как частную переменную уровня класса?
Я хотел бы использовать IEnumerable как частную переменную в контроллере, чтобы другие пользовательские ActionResults в одном контроллере могли использовать одну и ту же информацию без повторного запроса каждый раз. Я не имею в виду другие CRUD ActionResults, а другие пользовательские методы, которые делают вещи с данными, просматриваемыми на странице Index, которые обычно являются подмножеством полной таблицы базы данных. Было бы полезно запросить один раз, а затем повторно использовать те же данные.
В этом примере у меня есть private IEnumerable<CourseList> _data;
как переменная уровня класса и IEnumerable<CourseList> data
в качестве переменной уровня Index(). Я использую Debug.WriteLine
, чтобы определить, является ли каждая переменная пустой или нет.
Как я ожидал, в пределах индекса() ActionResult обеих переменных данных и _data не нуль. В пределах области ClickedFromIndexPageLink(), _data - переменная уровня класса имеет значение NULL.
Моя теория заключается в том, что, хотя я сначала загружал Index сначала, контроллер этого не знает. И что касается контроллера, когда я запрашиваю содержимое _data в другом ActionResult, оно еще не заполнено. Однако в режиме реального времени у есть индекс, который сначала щелкнул по индексу, поэтому должен увидеть _data, заполненный запросом индекса.
Чтобы увидеть, что я делаю в качестве обходного пути, прокрутите вниз, чтобы увидеть «Метод B (работает, но повторяется)».
Ц. Существует ли какой-либо простой способ иметь IEnumerable, используемый в качестве частной переменной класса таким образом, или мой метод обхода является единственным возможным подходом? Результаты
Debug.WriteLine()::
Метод A (не работает)
Begin Index() test *****
Is data Null? Not Null
Is _data Null? Not Null
End Index test *****
Begin ClickedFromIndexPageLink() test*****
Is _data Null? Null
End ClickedFromIndexPageLink test*****
Код:
using IenumerableAsClassVariable.Models;
using System.Collections.Generic;
using System.Data.Entity;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Web.Mvc;
namespace IenumerableAsClassVariable.Controllers
{
// This is the helper class & function used to determine if the IEnumerable is null or empty
public static class CustomHelpers
{
public static string IsNullOrEmpty<T>(this IEnumerable<T> enumerable)
{
if (enumerable == null)
return "Null";
else
return "Not Null";
}
}
public class CourseListsController : Controller
{
private CreditSlipLogContext db = new CreditSlipLogContext();
private IEnumerable<CourseList> _data;
// If IEnumerable is null or empty return true; else false.
// GET: CourseLists
public ActionResult Index()
{
IEnumerable<CourseList> data = db.CourseLists.AsEnumerable();
Debug.WriteLine("-----");
Debug.WriteLine("Begin Index test *****");
Debug.WriteLine("Is data Null? " + CustomHelpers.IsNullOrEmpty(data));
_data = data;
Debug.WriteLine("Is _data Null? " + CustomHelpers.IsNullOrEmpty(_data));
Debug.WriteLine("End Index test *****");
return View(db.CourseLists.ToList());
}
public ActionResult ClickedFromIndexPageLink()
{
Debug.WriteLine("Begin ClickedFromIndexPageLink test*****");
Debug.WriteLine("Is _data Null? " + CustomHelpers.IsNullOrEmpty(_data));
Debug.WriteLine("End ClickedFromIndexPageLink test*****");
ViewBag.IsDataNull = CustomHelpers.IsNullOrEmpty(_data);
return View();
}
#region OtherCrudActionResultsAreHidden
#endregion
}
}
Метод B (работает, но повторяется):
Как я ожидал, что мои результаты не нуль:
Begin ClickedFromIndexPageLink test*****
Is data Null? Not Null
Is _data Null? Not Null
End ClickedFromIndexPageLink test*****
Это потому, что я повторно запрос в ActionResult, так же как и я в Index() ActionResult:
public ActionResult ClickedFromIndexPageLink()
{
IEnumerable<CourseList> data = db.CourseLists.AsEnumerable();
Debug.WriteLine("Begin ClickedFromIndexPageLink test*****");
Debug.WriteLine("Is data Null? " + CustomHelpers.IsNullOrEmpty(data));
_data = data;
Debug.WriteLine("Is _data Null? " + CustomHelpers.IsNullOrEmpty(_data));
Debug.WriteLine("End ClickedFromIndexPageLink test*****");
ViewBag.IsDataNull = CustomHelpers.IsNullOrEmpty(_data);
return View();
}
В вашем примере я заметил, что вы используете список «один столбец». Будет ли этот пример работать для типизированного IEnumerable с несколькими столбцами? –
Да. Я обновляю ответ с вашими примерными данными. – Shyju
Посмотрите на обновленный ответ @Rubix_Revenge – Shyju