2010-11-18 12 views
0

这里,列表框加载示例文本。 我Model.aspx将列表框绑定来自后端MVC2

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)......我应该怎么做。

+0

你是什么意思“我应该怎么做?”在您将'Employees'属性分配给'MyViewModel'对象的代码中执行此操作。 – RPM1984 2010-11-18 05:54:14

+0

谢谢......但是,我不知道如何从后端获取值并在列表框中进行绑定。 – RobinHood 2010-11-18 06:10:23

回答

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; 
     } 
    } 
} 

OK,所以你可以看到,我们已经介绍了由Visual Studio中,当你从现有的数据库中添加一个新的实体自动生成的数据上下文类。如果你不熟悉Entity Framework,你可以阅读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这。