在我的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。
但是,如果我重构所有代码以使用它上面的模型,就好像我只有一组值可以使用,它就没有问题了!
有人能指出我正确的方向吗?
非常感谢提前!
答案 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