3

ASP.NET C# MVC 4 Code First 应用程序 - 在 Visual Studio 2012 Express、SQL Server 2012 Express 中。

我有一个地点对象。我想输出列表中所有地点的名称 - 每个地点旁边都有一个复选框。

然后,我希望登录用户选择他们喜欢的地方 - 并将其保存。然后他们可以登录并再次查看所有内容,并选中相应的复选框。

最好的方法是什么?我是 MVC 的新手,不确定这里的最佳实践。

谢谢

更新

下面的 CheckboxListFor 帮助器工作得很好,尽管如何处理用户选择并不明显(它只返回一个 ID 列表)。

我创建了以下内容以获取该 ID 列表 - 将其转换为对象列表,并将其添加到视图模型中的 SelecteCities 列表中。这将选中用户在发布页面之前选择的所有复选框:

public ActionResult Examples(PostedCities postedCities)
{
 // ViewModel
 CitiesViewModel cvm = new CitiesViewModel();

 // Create list of cities
 List<City> cities = new List<City>{
  new City { Id = 1, Name = "London"},
  new City { Id = 2, Name = "Saigon"},
  new City { Id = 3, Name = "New York"}
 };

 // Assign list of cities to ViewModel 
 cvm.AvailableCities = cities;

 // If posted cities present, user posted something (else probably first call)
 if (postedCities.CityIDs != null)
 {
    // temporary city object
    City cty = new City();

    // List of selected cities
    List<City> selCities = new List<City>();

    // Go through each postedCity ID
    foreach (string s in postedCities.CityIDs)
    {
       // Get ID of postedCity
       int IdSel = Convert.ToInt32(s);

       // Lookup city Id in cities
       cty = cities.Single(c => c.Id == IdSel);

       // Add selected city to cty object
       selCities.Add(cty);
    }

    // Fill cvm.SelectedCities with selCities
    cvm.SelectedCities = selCities;
 }

return View(cvm);
}

这行得通 - 这是一个好方法还是我把它复杂化了?还是做了坏事?

4

2 回答 2

5

您可以节省自己的工作并使用现有的 MvcCheckBoxList 库。

使用以下命令使用 nuget 安装它:

PM> Install-Package MvcCheckBoxList

这是他们的主页:MvcCheckBoxList
这里是文档:MvcCheckBoxList/Documentation

其他解决方案将需要一些难看的编码。

更新

正如Klas Mellbourn建议的那样(我很抱歉认为这是理所当然的)带有列表的视图模型将是此类场景的最佳实践。我提供的文档链接包含这样的示例,以便您更轻松地理解。

于 2013-05-18T20:58:12.540 回答
0

我会说 MVC 最佳实践是让视图模型镜像您希望显示的字段。它将包含一个带有项目的列表,每个项目都包含一个地名字符串和一个用于复选框的布尔值。

在显示页面的控制器方法中,您根据使用实体框架从数据库中填充的位置对象构建视图模型。

用户可能会使用某些命令(可能是提交按钮)保存状态。这将调用第二个控制器方法,该方法读取视图模型并使用实体框架保存内容。

于 2013-05-18T20:58:35.480 回答