在我的 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);
}