为什么Glass Mapper返回空值?

4

我正在使用Glass V4。我有一个MVC Web Area项目的设置。

我已经在主项目(WebProject)中安装了Glass Mapper。

我正在尝试在我的区域项目中进行Glass Casting。

 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中不需要注册我的命名空间。


你能检查一下你的项目是否已发布,并且在上下文语言中是否有版本吗? - Vlad Iobagiu
@sitecoreclimber,是的,我做了。 - Sakthivel
3个回答

5

您不应使用 _context.GetCurrentItem 方法。请改用 _context.GetItem 方法:

public ActionResult ContactUsGlass()
{
    var model = context.GetItem<ContactUsGlassModel>(RenderingContext.Current.Rendering.DataSource);
    return View(model);
}

您不希望从Sitecore.Context.Item(在GetCurrentItem方法中使用)获取模型。您需要从当前渲染的数据源中获取模型。


我已经更新了代码,var model = _context.GetItem<ContactUsGlassModel>(RenderingContext.Current.Rendering.DataSource);但是现在由于RenderingContext,我无法对代码进行单元测试。请问您能否提供建议? - Sakthivel
@Sakthivel 值得一读的是镜头中的生活 - 使用Glass控制器进行单元测试 - jammykam

0

@Marek提供的方式是正确的,可以将渲染项拉入模型中。 GetCurrentItem默认情况下会返回Sitecore服务的页面项。如果您的模型需要的字段是页面项的字段,则GetCurrentItem也可以填充您的模型。如果启用了数据源嵌套,并且渲染没有设置数据源,则Sitecore会再次返回页面项。


@Sakthivel,你可以从RenderingContext类中提取一个IRenderingContext接口。为IRenderingContext创建一个MVC模型绑定器并进行注册。我通常对大多数Sitecore.Context相关属性都使用这种模式。值得注意的是GlassModelBinder的这种模式。虽然不完全相同,但我在我的解决方案中使用了类似的方法链接 - phani
一定会尝试这个...谢谢...! - Sakthivel

0
你可以继承自GlassController,然后使用GetLayoutItem()方法获取数据源项。如果它是null,则需要在Sitecore中发布模板,并确保映射正确(如果您没有使用TDS的话):)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接