在 Umbraco 中,如何将通用对象列表绑定到我的视图?

In Umbraco, how can I bind a generic list of Objects to my View?

我的 umbraco 项目中发生了一些奇怪的事情,我有一个像这样设置的存储库;

public class HireItemsRepo:BaseGenericRepository<YouHireItContext,HireItem>
{
   public List<HireItemViewModel> PopulateHireItemViewModel(RenderModel model)
    { List<HireItemViewModel> HireItems = new List<HireItemViewModel>();   
        foreach (var Hireitem in base.GetAll())
        {
            HireItems.Add(
              new HireItemViewModel(model.Content)
              {
                  Title = Hireitem.Title,
                  Price = Hireitem.Price
              }
           );
        }
        return HireItems;
    }

}

我在我的控制器中使用的是这样的

 public class HiresController : RenderMvcController
    {
        // GET: Hire
        public override ActionResult Index(RenderModel model)
        {

            HireItemsRepo repo = new HireItemsRepo();
            var VM = repo.PopulateHireItemViewModel(model);

                return View("Hires",VM.ToList());
        }
    }

并像这样在视图中使用该模型;

    @model List<You_Hire_It.Models.HireItemViewModel>

   /*HTML starts here*/

这很奇怪,因为如果我尝试将该模型用作列表,Umbraco 会因以下错误而崩溃;

无法绑定源类型 System.Collections.Generic.List`1[[You_Hire_It.Models.HireItemViewModel, You_Hire_It, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]模型类型 Umbraco.Web.Models.RenderModel.

但是,如果我重构所有代码以单独使用模型,就像我只有一组值要使用一样,它没有问题!

有人能用这个给我指出正确的方向吗?

非常感谢!

那是因为您从操作中 return 的模型需要是 RenderModel 类型或从它继承,在您的情况下,您 return 正在 List. 所以你的模型应该是这样的:

public class ViewModel : RenderModel
{
    public ViewModel(IPublishedContent content) : base(content) { }

    public List<HireItem> HireItems { get; set; }
}

public override ActionResult Index(RenderModel model)
{
    var vm = new ViewModel(model);
    vm.HireItems = new HireItemsRepo().GetHireItems();
    return View("Hires", vm);
}

您可以按照 DZL 的建议从 RenderModel 继承。但是,我通常更喜欢使用路由劫持,这将使我的模型保持简单。

您可以创建一个与视图同名的方法,而不是 RenderMvcController 中的 Index 方法。我注意到您的视图称为 Hires。因此,将您的控制器代码更改为:

public class HiresController : RenderMvcController
{
    // GET: Hire
    public ActionResult Hires(RenderModel model)
    {
        HireItemsRepo repo = new HireItemsRepo();
        var VM = repo.PopulateHireItemViewModel(model);

        return CurrentTemplate(VM)
    }
}

您现在需要让您的视图继承自 UmbracoViewPage。因此,在您的视图顶部,将 @model 行替换为以下内容:

@inherits UmbracoViewPage<List<HireItemViewModel>>

视图中的模型现在是 List<HireItemViewModel> 类型,我认为这正是您想要的。

因此要迭代您将使用的项目:

@foreach(var item in Model){
{
    // etc
}

此外,由于此视图现在继承自 UmbracoViewPage,您可以访问 UmbracoContext - 只需使用 @Umbraco

例如:

@Umbraco.TypedContentAtRoot().Where(x=>x.DocumentTypeAlias == "HomePage")

@Umbraco.AssignedContentItem etc