Umbraco:使用来自mvc model的prevalues创建CheckBoxList属性

时间:2014-10-16 11:15:27

标签: asp.net asp.net-mvc umbraco umbraco7

我想要做的是创建一个CheckBoxList属性,这样编辑器就可以在BO中选择特定于当前页面(酒店名称)的设施,并根据检查的内容呈现内容。

我创建了一个模型:

public class Facility
{
    public int Id { get; set; }
    public string Description { get; set; }
    public string IconUrl { get; set; }

    public List<Facility> GetFacilities()
    {
        return new List<Facility>() 
        {  
            new Facility() { Id = 4, Description = "Free parking", IconUrl = "" },
            new Facility() { Id = 6, Description = "Spa", IconUrl = "" },
            new Facility() { Id = 7, Description = "Free Wifi", IconUrl = "" },
            new Facility() { Id = 2, Description = "Tennis", IconUrl = "" },
            new Facility() { Id = 9, Description = "Room service", IconUrl = "" },
            new Facility() { Id = 10, Description = "Fitness", IconUrl = "" }
        };
    }

}

如何使用GetFacilities()方法中设置的值创建CheckBoxList?或者我应该使用此方法在AppCode文件夹中创建一个新类?放置此类功能的最佳位置在哪里,我该如何实现?

2 个答案:

答案 0 :(得分:1)

您的Facility模型应包含一个布尔值,以指示其是否已被选中

public class FacilityVM
{
  public int Id { get; set; }
  public string Description { get; set; }
  public bool IsSelected { get; set; }
{

public class HotelVM
{
  public int ID{ get; set; }
  ....
  public List<FacilityVM> Facilities { get; set; }
}

控制器

public ActionResult Edit(int ID)
{
  HotelVM model = new HotelVM();
  model.Facilities = // populate the list of available facilities
  // Get the hotel from repository and map properties to the view model
  return View(model);
}

public ActionResult Edit(HotelVM model)
{
  ...
  foreach(FacilityVM facility in model.Facilities)
  {
    if (facility.IsSelected)
    {
      // do something
    }
  }
  ....
}

查看

@model HotelVM
@using (Html.BeginForm())
{
  // render properties of hotel
  ....
  for (int i = 0; i < Model.Facilities.Count; i++)
  {
    @Html.HiddenFor(m => m.Facilities[i].ID);
    @Html.HiddenFor(m => m.Facilities[i].Description);
    @Html.CheckBoxFor(m => m.Facilities[i].IsSelected)
    @Html.LabelFor(m => m.Facilities[i].IsSelected, Model.Facilities[i].Description)
  }
  <input type="submit" value="Save" />
}

答案 1 :(得分:1)

我认为你正在考虑斯蒂芬所建议的错误方式(除非我误解了你的问题)。您正在创建一个键/值对列表,并且只有一个将在BO中被选中,因此只有一个将发布到前端(无论是否使用它)。

因此,在BO中,您只需要一个带有键/值对的下拉列表。您可以使用“下拉列表(发布密钥)”数据类型创建它。还要考虑使用“SQL下拉列表”列表数据类型,因为这样可以提供更大的灵活性。

如果您需要将所选ID转换为Facility对象,请使用实现IPropertyEditorValueConverter接口的类单独执行此操作。有关更多信息,请参见此处:

http://our.umbraco.org/documentation/extending-umbraco/Property-Editors/PropertyEditorValueConverters