为什么 Glass Mapper 返回空值?
Why Glass Mapper Returning Null Values?
我使用的是 Glass V4。我有一个 MVC Web 区域项目的设置。
我已经在主项目 (WebProject) 中安装了 Glass Mapper。
我正尝试在我的区域项目中进行玻璃铸造。
public class ContactController : SitecoreController
{
private readonly ISitecoreContext _context;
private IGlassHtml _glassHtml;
public ContactController()
: this(new SitecoreContext())
{
}
public ContactController(ISitecoreContext context)
{
_context = context;
_glassHtml = new GlassHtml(context);
}
// GET: Contact
public ActionResult ContactUs()
{
var db = Sitecore.Context.Database;
var datasource = db.GetItem(RenderingContext.Current.Rendering.DataSource);
var ViewModel = new Models.ContactUs();
ViewModel.Headerstring = datasource.Fields["Headerstring"].Value;
ViewModel.Substring = datasource.Fields["Substring"].Value;
ViewModel.Description = ((MultilistField)datasource.Fields["Description"]).GetItems().Select(s => s.Fields["Line"].Value).ToList<string>();
return View(ViewModel);
}
public ActionResult ContactUsGlass()
{
var model = _context.GetCurrentItem<ContactUsGlassModel>();
return View(model);
}
}
我可以使用第一个操作方法获取值,但不能使用第二个操作方法。
型号:
public class ContactUs
{
public string Headerstring { get; set; }
public string Substring { get; set; }
public List<string> Description { get; set; }
}
玻璃模型:
public class ContactUsGlassModel
{
public virtual string Headerstring { get; set; }
public virtual string Substring { get; set; }
}
我知道我不需要在 Glass V4 中注册我的命名空间。
你不应该使用 _context.GetCurrentItem
方法。使用 _context.GetItem
代替:
public ActionResult ContactUsGlass()
{
var model = context.GetItem<ContactUsGlassModel>(RenderingContext.Current.Rendering.DataSource);
return View(model);
}
您不想从 Sitecore.Context.Item
中获取模型(在 GetCurrentItem
方法中使用。您想从当前渲染的数据源中获取模型。
@Marek 回答的是将渲染项拉入模型的正确方法。默认情况下,GetCurrentItem 提供由 Sitecore 提供的页面项目。如果您的模型需要的字段是页面项目的字段,那么 GetCurrentItem 也可以填充您的模型。如果启用了数据源嵌套,那么如果数据源未在渲染上设置,Sitecore returns 页面项目再次。
您可以从 GlassController 继承,然后使用 GetLayoutItem() 来获取数据排序项。如果它为空,那么您需要在 sitecore 中发布模板,如果您不使用 TDS,请确保您的映射是正确的 :)
我使用的是 Glass V4。我有一个 MVC Web 区域项目的设置。
我已经在主项目 (WebProject) 中安装了 Glass Mapper。
我正尝试在我的区域项目中进行玻璃铸造。
public class ContactController : SitecoreController
{
private readonly ISitecoreContext _context;
private IGlassHtml _glassHtml;
public ContactController()
: this(new SitecoreContext())
{
}
public ContactController(ISitecoreContext context)
{
_context = context;
_glassHtml = new GlassHtml(context);
}
// GET: Contact
public ActionResult ContactUs()
{
var db = Sitecore.Context.Database;
var datasource = db.GetItem(RenderingContext.Current.Rendering.DataSource);
var ViewModel = new Models.ContactUs();
ViewModel.Headerstring = datasource.Fields["Headerstring"].Value;
ViewModel.Substring = datasource.Fields["Substring"].Value;
ViewModel.Description = ((MultilistField)datasource.Fields["Description"]).GetItems().Select(s => s.Fields["Line"].Value).ToList<string>();
return View(ViewModel);
}
public ActionResult ContactUsGlass()
{
var model = _context.GetCurrentItem<ContactUsGlassModel>();
return View(model);
}
}
我可以使用第一个操作方法获取值,但不能使用第二个操作方法。
型号:
public class ContactUs
{
public string Headerstring { get; set; }
public string Substring { get; set; }
public List<string> Description { get; set; }
}
玻璃模型:
public class ContactUsGlassModel
{
public virtual string Headerstring { get; set; }
public virtual string Substring { get; set; }
}
我知道我不需要在 Glass V4 中注册我的命名空间。
你不应该使用 _context.GetCurrentItem
方法。使用 _context.GetItem
代替:
public ActionResult ContactUsGlass()
{
var model = context.GetItem<ContactUsGlassModel>(RenderingContext.Current.Rendering.DataSource);
return View(model);
}
您不想从 Sitecore.Context.Item
中获取模型(在 GetCurrentItem
方法中使用。您想从当前渲染的数据源中获取模型。
@Marek 回答的是将渲染项拉入模型的正确方法。默认情况下,GetCurrentItem 提供由 Sitecore 提供的页面项目。如果您的模型需要的字段是页面项目的字段,那么 GetCurrentItem 也可以填充您的模型。如果启用了数据源嵌套,那么如果数据源未在渲染上设置,Sitecore returns 页面项目再次。
您可以从 GlassController 继承,然后使用 GetLayoutItem() 来获取数据排序项。如果它为空,那么您需要在 sitecore 中发布模板,如果您不使用 TDS,请确保您的映射是正确的 :)