Привязка списка со стороны бэкенда MVC2 - PullRequest
0 голосов
/ 18 ноября 2010

Здесь в список загружается образец текста. Мой Model.aspx будет

 public class Employee
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public class MyViewModel
{
    public string[] SelectedEmployeeIds { get; set; }
    public IEnumerable<Employee> Employees { get; set; }
} 

HomeController.cs

 public ActionResult About()
    {
        var model = new MyViewModel
        {
            Employees = Enumerable.Range(1, 5).Select(i => new Employee
         {
             Id = i.ToString(),
             Name = "employee " + i
         })
        };
      return View(model);
     }

About.aspx

<%: Html.ListBoxFor(
    x => x.SelectedEmployeeIds, 
    new SelectList(Model.Employees, "Id", "Name") 
) %>

Приведенный выше код работает нормально. Я хочу загрузить список из Бэкэнда (т.е. таблицы Emp) ... Где мне это сделать.

1 Ответ

1 голос
/ 18 ноября 2010

Вы не предоставили никакой информации об этом Emp Table.Правильный способ сделать это в ASP.NET MVC - это абстрагировать доступ к данным в репозиторий и использовать этот репозиторий с вашего контроллера:

public interface IEmployeesRepository
{
    IEnumerable<Employee> GetEmployees();
}

И теперь ваш контроллер становится:

public class HomeController: Controller
{
    private readonly IEmployeesRepository _repository;
    public HomeController(IEmployeesRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Employees = _repository.GetEmployees()
        };
        return View(model);
    }
}

Как вы можете видеть, доступ к данным удален от контроллера, и на самом деле его не волнует, откуда эти сотрудники.Именно в этот момент это перестает быть вопросом, связанным с ASP.NET MVC, и становится вопросом о том, как реализовать этот интерфейс с использованием некоторой технологии доступа к данным.

Предположим, что вы использовали Linq to Entities как ORM,Ваша реализация может выглядеть так:

public class EmployeesRepositorySql: IEmployeesRepository
{
    public IEnumerable<Employee> GetEmployees()
    {
        using (var db = new EmployeesDbContext())
        {
            return db.Employees;
        }
    }
}

ОК, так что, как вы можете видеть, мы ввели класс контекста данных, который автоматически генерируется Visual Studio при добавлении новой сущности из существующей базы данных.Если вы не знакомы с Entity Framework, вы можете прочитать некоторые учебные пособия по началу работы .

или если вы предпочитаете использовать ADO.NET напрямую:

public class EmployeesRepositorySql: IEmployeesRepository
{
    public IEnumerable<Employee> GetEmployees()
    {
        using (var conn = new SqlConnection("SOME CONNECTION STRING"))
        using (var cmd = conn.CreateCommand())
        {
            conn.Open();
            cmd.CommandText = "SELECT Id, Name FROM Employees;";
            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    yield return new Employee
                    {
                        Id = reader.GetString(0),
                        Name = reader.GetString(1)
                    };
                }
            }
        }
    }
}

Последняя оставшаяся часть - дать нашему контроллеру команду использовать эту конкретную реализацию хранилища.Это может быть достигнуто с помощью структуры DI.Вот статья , объясняющая это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...