从另一个SQL Server数据库中检索记录 - Umbraco

时间:2014-07-02 02:06:35

标签: c# sql entity-framework asp.net-mvc-4 umbraco7

我正在一个网站上工作,我需要从与我的Umbraco数据库相同的SQL Server上的另一个数据库中检索价目表。

要求它必须位于单独的数据库中。

我创建了一个新的连接字符串Pricelist并使用了EF数据库优先。

PriceList存储库:

namespace UmbracoCMS.Repository{
using System;
using System.Collections.Generic;

public partial class Prisliste
{
    public string Kode { get; set; }
    public string Speciale { get; set; }
    public string Ydelsesgruppe { get; set; }
    public string Gruppe { get; set; }
    public string Ydelse { get; set; }
    public string Ydelsestekst { get; set; }
    public string Anaestesi { get; set; }
    public string Indlæggelse { get; set; }
    public Nullable<double> Listepris { get; set; }
    public Nullable<int> WebSort { get; set; }
    public string YdelsesTekstDK { get; set; }
    public string Frapris { get; set; }
    public Nullable<int> Sortering { get; set; }
   } 
}

PriceListController上课:

using System;
using System.Linq;
using System.Web.Mvc;

using UmbracoCMS.Repository;

namespace UmbracoCMS.Controllers{

   public class PriceListController : Umbraco.Web.Mvc.SurfaceController {

   [HttpGet]
   public PartialViewResult GetPriceList(string contentTitle){

      var db = new PricelistContext();


      var query = from b in db.Prislistes orderby b.Speciale select b;

      Console.WriteLine("records in the database:");

      foreach (var item in query)
      {
        Console.WriteLine(item.Speciale);
      }

      return PartialView("~/views/partials/PriceList.cshtml");
    }
  }
}

我想要的是根据文档类型的属性加载治疗的价格。我只是不确定umbraco中的这个怎么做,因为我是一个相当新的umbraco。

因此,当请求治疗页面时,我需要获取属性ContentTitle值。使用它来检索具有相同Speciale的所有记录,并将它们显示在列表/表中。

带有查询

.where(b.Speciale = contentTitle)

如果有人可以帮助一点,或者引导我朝着正确的方向前进,那就太棒了。

是否可以在同一个http请求中执行此操作?或者我应该使用部分视图或宏来同时从umbraco数据库获取文档类型的属性,以及在用户进入治疗页面的同时获取价格表数据库中的记录?

或者有更好的方法吗?



更新

非常感谢Ryios。

我还有一个问题。

using System;
using System.Linq;
using System.Web.Mvc;

namespace UmbracoCMS.Controllers
{
  public class PriceListSurfaceController : Umbraco.Web.Mvc.SurfaceController
  {

      public ActionResult GetPriceList(string contentTitle)
      {

          PricelistContext.RunInContext(db =>
          {
              var result = db.Prislistes.OrderBy(p => p.Speciale);

          });

          return View(result);
      }
   }
}

我得到了它的工作,所以它调用方法并且来自Pricelist数据库的数据显示在:

var result = db.Prislistes.OrderBy(p => p.Speciale);

现在我只需要将价格列表再次输入到视图中,这样我就可以显示价格列表或表格。

你对Umbraco如何做到这一点有什么建议吗?通常我会在MVC中返回一个ViewModel,如:

return View(new ListViewModel(result));

并在视图中使用它:

@model Project.ViewModels.ListViewModel

所以我可以循环使用它。

但我仍然希望获得“Home”/“TreatmentPage”文档类型的属性。

我应该使用partialView还是有更好的方法?

解决

如果其他人处于相似的情境中,我想我想分享它。

控制器:

namespace UmbracoCMS.Controllers
{
    public class PriceListSurfaceController : Umbraco.Web.Mvc.SurfaceController
    {



        public PartialViewResult PriceList(string contentTitle)
        {
            List<Prisliste> result = null; 

            PricelistContext.RunInContext(db =>
            {
                result = db.Prislistes.Where(p => p.Speciale == contentTitle)
                     .OrderBy(p => p.Speciale).ToList();  
            });

            var model = result.Select( pl => new PrislistVm()
           {
               Speciale = pl.Speciale,
               Listepris= pl.Listepris
           });

           return PartialView(model);
       }



   }

}

视图模型:

namespace UmbracoCMS.ViewModels
{
    public class PrislistVm
    {

       public PrislistVm()
       {
           Results = new List<Prisliste>();
       }

       public List<Prisliste> Results { get; set; } 

       public string Speciale { get; set; }
       public double listepris { get; set; }
   }
}

查看/ PriceListSurface:

@model IEnumerable<UmbracoCMS.ViewModels.PrislistVm>

@{
     ViewBag.Title = "PriceList";
}

 <h2>PriceList</h2>



      @foreach (var item in Model)
      {
            @item.Speciale
            @item.Listepris
      }

1 个答案:

答案 0 :(得分:1)

  1. 如果加载这样的EF上下文,就会发生内存泄漏。我建议使用llambda回调创建一个包装它的方法。把它放在你的上下文类中。

    public static void RunInContext(Action<PricelistContext> contextCallBack)
    {
        PricelistContext dbContext = null;
        try
        {
            dbContext = new PricelistContext();
            contextCallBack(dbContext);
        }
        finally
        {
            dbContext.Dispose();
            dbContext = null;
        }
    }
    
    //Example Call
    PricelistContext.RunInContext(db => {
        var result = db.PrisListes.OrderBy(p => p.Speciale);
        //loop through your items
    });
    
  2. 要获取DocumentType的值,它取决于调用上下文。假设您使用的是附加到文档类型的Razor模板,它与内容页面相关联。

    @inherits Umbraco.Web.Mvc.UmbracoTemplatePage
    @{
        Layout = "ContentPageLayout.cshtml";
    }
    @* Call GetPriceList on PriceListController with Parameter contentTitle *@
    @Html.Action("GetPriceList", "PriceListSurface", new { contentTitle =     Model.Content.GetPropertyValue<string>("ContentTitle") });
    
  3. 在上面的示例中,我创建了一个文档类型,其中包含一个名为ContentTitle的属性,该属性与名为ContentPage的视图相关联。然后我在后台内容部分创建了名为&#34; Home&#34;使用文档类型。给我一个像

    的网址
    http://localhost/home
    

    此外,您的SurfaceController将无法正常工作。 Umbraco用于映射表面控制器路径的逻辑对于表面控制器的命名约定有一些要求。您必须使用&#34; SurfaceController&#34;结束类的名称。然后它被称为PriceListSurfaceController,然后它将控制器的名称映射为&#34; PriceListSurface&#34;。

    这里是SurfaceController功能的文档。

    http://our.umbraco.org/documentation/Reference/Mvc/surface-controllers

    使用表面控制器是正确的逻辑。在UmbracoTemplatePage中调用数据层代码并不是一种好习惯。 1,因为RazorTemplates被解释/编译并且SurfaceController是在dll中编译的JIT,所以SurfaceController代码的速度更快。 2因为您可以在MVC Razor中进行异步Controller调用。如果它全部在视图中,那么将所有内容转换为异步将非常困难。将服务器端逻辑保留在控制器中是最好的。

    或者,您可以劫持Umbraco路线并将其替换为不必从SurfaceController继承的自定义控制器,这使得它可能将内容表面显示给不属于或不属于的浏览器一把umbraco。

    http://our.umbraco.org/documentation/Reference/Mvc/custom-controllers

    您还可以在后台创建一个新部分来管理您的价目表&#34;构建一个的ui框架是针对AngularJS编写的,#34;

    http://www.enkelmedia.se/blogg/2013/11/22/creating-custom-sections-in-umbraco-7-part-1.aspx