2

所以,我试图找到 Umbraco 节点(作为 iPublishedContent),并将其传递给 viewModel(作为劫持路线)。所以我把它放在我的控制器中:

private AddCouponCodesViewModel viewModel;
public AddCouponCodesController(){
    //Get iPublished content
    IPublishedContent content = Umbraco.TypedContent(1225);
    //Pass to viewModel
    viewModel = new AddCouponCodesViewModel(content);
    RouteData.DataTokens["umbraco"] = content;
}
public ActionResult Index()
{
    //return view etc
}

但我越来越

Exception Details: System.NullReferenceException: 
Object reference not set to an instance of an object.

这里:

 Source Error(AddCouponCodesViewModel.cs): 
 Line 20: 
 Line 21:         }
 Line 22:         public AddCouponCodesViewModel(IPublishedContent content)
 Line 23:             : base(content)
 Line 24:         {

AddCouponCodeRenderModel.cs:

public class AddCouponCodesViewModel : RenderModel
    {
    public string test { get; set; }
    public List<string> tables { get; set; }
    public List<string> errors { get; set; }

    public AddCouponCodesViewModel(IPublishedContent content, CultureInfo culture) : base(content, culture)
    {

    }
    public AddCouponCodesViewModel(IPublishedContent content)
        : base(content)
    {

    }

这是 Global.asax

public class Global : UmbracoApplication
{
    protected override void OnApplicationStarted(object sender, EventArgs e)
    {
        base.OnApplicationStarted(sender, e);

        BundleConfig.RegisterBundles(BundleTable.Bundles);
        //AreaRegistration.RegisterAllAreas();
        //WebApiConfig.Register(GlobalConfiguration.Configuration);
        //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        //RouteConfig.RegisterRoutes(RouteTable.Routes);

        base.OnApplicationStarting(sender, e);

        RouteTable.Routes.MapRoute(
        "AddCouponCodes",                                              // Route name
        "Admin/{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "AddCouponCodes", action = "Index", id = "" }  // Parameter defaults
         );


    }

}

内容已发布(我已检查并仔细检查),并且节点 ID 正确。

我基本上在这里尝试做的是让路由 example.com/Admin/{controller}/{action}/{parameter} 被路由,但是在将它与 umbracoNode 连接时遇到问题(并且类 RenderModel 需要iPublishContent 对象作为参数,但我在尝试传递任何东西时都不走运)

有人可以在这里帮助我吗,在这方面被困了太多小时:-(

4

3 回答 3

1

澄清一下,如果你劫持了一条路线,这意味着你正在覆盖 Umbraco 将它传递RenderModel到它的一个已发布页面的方式。您可以通过覆盖 main 来全局执行此操作RenderMvcController,也可以在特定的DocumentType基础上覆盖。例如,如果我有一个 Homepage 文档类型,我可以创建:

public HomepageController : RenderMvcController
{
    public override ActionResult Index(RenderModel model)
    {
        // Create your new renderModel here, inheriting
        // from RenderModel

        return CurrentTemplate(renderModel);
    }
}

这将通过这一操作将所有呼叫路由到主页。为此,您无需在路由表中定义任何新路由。并且您应该在操作中而不是在构造函数中覆盖渲染模型。

您的问题有点令人困惑,您要达到的目标并不完全清楚,因为:

  • 您已经定义了一条路线,并且
  • 在您的构造函数中,您正在调用Umbraco.TypedContent(1225)以检索特定的已发布节点

所以......如果您尝试路由的管理页面本身已由 Umbraco 发布(听起来不像),只需创建一个具有页面文档类型名称的新控制器并覆盖渲染模型以上述方式。

但是......如果您的管理页面尚未由 Umbraco 发布,并且您只希望管理页面访问节点数据,那么您有几个选择:

  • 创建一个表面控制器,继承自 SurfaceController。这将使您能够访问 Umbraco 上下文等;或者
  • 创建一个标准控制器(最好在一个区域中)并ContentCache使用 Autofac 之类的东西注入

例如:

builder.RegisterControllers(typeof (AdminController).Assembly)
       .WithParameter("contentCache", UmbracoContext.Current.ContentCache);
  • 创建一个标准控制器(最好在一个Area中)并使用Umbraco的ContentServiceAPI访问节点,即new Umbraco.Core.Services.ContentService().GetById(1225)

最后两种方法的区别在于:

  • 注入ContentCache为您提供只读但非常快速的访问已发布内容的权限。
  • 访问ContentService为您提供对节点本身的读/写访问权限,但会以牺牲速度为代价,因为您直接查询数据库。

这取决于你的要求是什么。

无论哪种方式,都值得花时间阅读有关劫持 Umbraco 路线的文档,并至少尝试了解正在发生的事情。

于 2013-09-25T11:26:01.390 回答
0

在您的视图模型上创建一个无参数构造函数,如下所示:

 public AddCouponCodesViewModel(): 
    this(new UmbracoHelper(UmbracoContext.Current).
TypedContent(UmbracoContext.Current.PageId))
   {
   }

这将获得您的其他构造函数正在寻找的上下文。在您创建了具有特定构造函数的类后,编译器默认停止生成无参数的类。由于您需要一个无参数构造函数,这就是如何获取一个并仍然传递您的视图模型所需的 Umbraco 上下文信息

于 2013-09-25T06:22:25.010 回答
0

好吧,我可以告诉您,您的视图没有为 Razor 标记提供任何内容,因为您的 Index 方法没有提供任何内容。这是一个问题。我还可以告诉您,在您的 AddCouponCodesViewModel 中,您需要一个空的构造函数,以便 razor 语法可以创建一个实例,然后填充它以将您提交的对象与视图相匹配。

修改您的 ViewController :

  public ActionResult Index()
  {
        return View(viewModel);
  }

修改您的 AddCouponCodesViewModel 以添加一个 Empty 构造函数:

public AddCouponCodesViewModel()
{
}
于 2013-09-24T18:46:23.390 回答