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

本文关键字:Umbraco 检索 记录 数据库 另一个 SQL Server | 更新日期: 2023-09-27 18:11:14

我正在一个网站上工作,在那里我需要检索价格表,从同一SQL Server上的另一个数据库作为我的Umbraco数据库。

这是一个要求,它必须在一个单独的数据库。

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

PriceList repository:

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 class:

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数据库获取文档类型的属性,同时从pricelist数据库获取记录?

或者有更好的方法来做到这一点?

更新:

非常感谢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);
       }

   }
}

ViewModel:

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
      }

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

  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") });
    
在上面的例子中,我创建了一个文档类型,其属性名为ContentTitle,它与一个名为ContentPage的视图相关联。然后,我在名为"Home"的后台内容部分中创建了使用文档类型的内容。给我一个url,比如
http://localhost/home

同样,你的SurfaceController将不能工作。Umbraco用于映射表面控制器路由的逻辑对表面控制器的命名约定有一些要求。你必须以"SurfaceController"作为类名的结尾然后它就变成了" PriceListSurfaceController "然后它用"PriceListSurface"来映射控制器。

这是SurfaceController特性的文档

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

使用表面控制器是正确的逻辑。在UmbracoTemplatePage中调用数据层代码并不是一个好的做法。1、因为RazorTemplates是解释/编译的,而SurfaceController是JIT编译到dll中的,所以SurfaceController代码更快。2因为你可以在MVC Razor中进行异步控制器调用。如果它都在视图中,那么将所有内容转换为异步将变得非常困难。最好将服务器端逻辑放在控制器中。

你也可以劫持一个Umbraco路由,并将其替换为一个自定义控制器,而不需要从SurfaceController中继承,这使得它有可能向浏览器显示属于或不属于Umbraco的内容。

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

你也可以在后台创建一个新的部分来管理你的价格表"构建价格表的ui框架是基于AngularJS编写的"

http://www.enkelmedia.se/blogg/2013/11/22/creating -自定义-区域-在- 1. - umbraco - 7部分aspx