来自后端MVC2的列表框绑定

时间:2010-11-18 05:45:30

标签: asp.net-mvc asp.net-mvc-2

这里,列表框加载了示例文本。 我的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 Table)......我应该在哪里做。

1 个答案:

答案 0 :(得分:1)

您未提供有关此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自动生成的数据上下文类。如果您不熟悉实体框架,可以阅读一些getting started tutorials

或者如果您更喜欢直接使用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框架实现。这是article explaining这个。