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

时间:2018-01-13 18:24:52

标签: c# generics umbraco umbraco7

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

<li>

我在我的控制器中使用

function loadcomments(id){
    $.ajax({
        url: '/ajax/getcomments/',
        data: {
            'identifier': '{{ identifier }}',
            'id': id,
            'begin': '0',
            'end': '30',
        },
        dataType: 'json',
        success: function (data) {
            var json = JSON.parse(data.comments);
            console.log(json);
            makeUL(json);
            function makeUL(array) {
                list = document.getElementById('commentlist');
                for(var i = 0; i < array.length; i++) {
                    if(!document.getElementById("comment-id-" + array[i].pk)){
                        var item = document.createElement('li');
                        item.className = "commentlistelement"
                        item.setAttribute('id',"comment-listitem-id-" + array[i].pk)
                        var maindiv = document.createElement('div')
                        maindiv.setAttribute('id',"comment-id-" + array[i].pk);
                        maindiv.className = "row comment";
                        maindiv.setAttribute("style","padding-left: "+3*array[i].fields.indent+"vw;");
                        maindiv.innerHTML = "<div class=\"col-md-1\">profile<br>pic</div><div class=\"col-md-9\"><small>"+ array[i].fields.user +"  </small><small><button class=\"buttonlink\" onclick=\"reply("+ array[i].pk +")\">reply</button></small> <small><button class=\"buttonlink\" onclick=\"loadcomments("+ array[i].pk +")\">show more</button></small><br><p>" + array[i].fields.description + "</p></div>";
                        item.appendChild(maindiv);
                        list.appendChild(item);
                    }
                }
                return list;
            }
        }
    });
};

在视图中使用该模型;

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

}

这很奇怪,因为如果我尝试将该模型用作List,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。

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

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

非常感谢提前!

2 个答案:

答案 0 :(得分:1)

这是因为您从操作返回的模型必须是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);
}

答案 1 :(得分:1)

您可以像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