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



在我的 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。

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

有人可以指出我正确的方向吗?

提前非常感谢!

你可以按照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

这是因为您从操作返回的模型需要是 RenderModel 类型或从它继承,在您的情况下,您返回的是 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);
}

相关内容

  • 没有找到相关文章

最新更新