C# 如何定位果园中的图像资源

C# 如何定位果园中的图像资源,c#,asp.net-mvc,image,url,orchardcms,C#,Asp.net Mvc,Image,Url,Orchardcms,我想在MVC视图中获得一个指向图像资源的链接,该视图是Orchard模块的一部分 通过谷歌搜索,可以得出以下方法: 它在视图中使用@Html.ResourceUrl()来获取资源URL 我想知道ResourceUrl()从何而来,因为它没有在MSDN中记录,我也不能在我的项目中使用它 是否有人已经使用了这种方法,并且可以解释这里缺少了什么 更新: 我想出来了。以下代码与Orchard模块相关 首先,您需要向Orchard模块添加一个资源清单,如下所示 public class Resource

我想在MVC视图中获得一个指向图像资源的链接,该视图是Orchard模块的一部分

通过谷歌搜索,可以得出以下方法:

它在视图中使用
@Html.ResourceUrl()
来获取资源URL

我想知道
ResourceUrl()
从何而来,因为它没有在MSDN中记录,我也不能在我的项目中使用它

是否有人已经使用了这种方法,并且可以解释这里缺少了什么

更新:

我想出来了。以下代码与Orchard模块相关

首先,您需要向Orchard模块添加一个资源清单,如下所示

public class ResourceManifest : Orchard.UI.Resources.IResourceManifestProvider
{
  public void BuildManifests(Orchard.UI.Resources.ResourceManifestBuilder aBuilder)
  {
    Orchard.UI.Resources.ResourceManifest lManifest = aBuilder.Add();

    string lModulePath = "~/Modules/YourModuleName";

    lManifest.DefineResource("ProfilePicture", "User1").SetUrl(lModulePath + "/Images/User1.png");
  }
}
然后扩展Html对象:

// This class adds so called "extension methods" to class System.Web.Mvc.HtmlHelper
public static class HtmlHelperExtensions
{
  // This method retrieves the URL of a resource defined in ResourceManifest.cs via the Orchard resource management system
  public static string ResourceUrl(this System.Web.Mvc.HtmlHelper aHtmlHelper, string aResourceType, string aResourceName)
  {
    // note:
    //  resolving Orchard.UI.Resources.IResourceManager via work context of orchard because
    //    - calling System.Web.Mvc.DependencyResolver.Current.GetService() does not work as it always returns null at this point
    //    - constructor parameter injection is not allowed in static classes
    //    - setting the resource manager from another class that uses constructor parameter injection does not work as it causes a "circular component dependency "
    Orchard.WorkContext lWorkContext = Orchard.Mvc.Html.HtmlHelperExtensions.GetWorkContext(aHtmlHelper);

    Orchard.UI.Resources.IResourceManager lResourceManager = (Orchard.UI.Resources.IResourceManager)lWorkContext.Resolve<Orchard.UI.Resources.IResourceManager>();
    if (lResourceManager != null)
    {
      Orchard.UI.Resources.RequireSettings lSettings = new Orchard.UI.Resources.RequireSettings { Type = aResourceType, Name = aResourceName, BasePath = aResourceType };

      Orchard.UI.Resources.ResourceDefinition lResource = lResourceManager.FindResource(lSettings);
      if (lResource != null)
      {
        Orchard.UI.Resources.ResourceRequiredContext lContext = new Orchard.UI.Resources.ResourceRequiredContext { Resource = lResource, Settings = lSettings };

        string lAppBasePath = System.Web.HttpRuntime.AppDomainAppVirtualPath;

        return lContext.GetResourceUrl(lSettings, lAppBasePath);
      }
    }

    return null;
  }
}
//该类将所谓的“扩展方法”添加到类System.Web.Mvc.HtmlHelper中
公共静态类HtmlHelperExtensions
{
//此方法通过Orchard资源管理系统检索ResourceManifest.cs中定义的资源的URL
公共静态字符串ResourceUrl(this System.Web.Mvc.HtmlHelper aHtmlHelper,string为资源类型,string为资源名称)
{
//注:
//通过Orchard的工作上下文解析Orchard.UI.Resources.IResourceManager,因为
//-调用System.Web.Mvc.DependencyResolver.Current.GetService()不起作用,因为此时它总是返回null
//-静态类中不允许构造函数参数注入
//-从另一个使用构造函数参数注入的类设置资源管理器不起作用,因为它会导致“循环组件依赖”
Orchard.WorkContext lWorkContext=Orchard.Mvc.Html.HtmlHelperExtensions.GetWorkContext(aHtmlHelper);
Orchard.UI.Resources.IResourceManager lResourceManager=(Orchard.UI.Resources.IResourceManager)lWorkContext.Resolve();
if(lResourceManager!=null)
{
Orchard.UI.Resources.requireResettings lSettings=new Orchard.UI.Resources.requireResettings{Type=aResourceType,Name=aResourceName,BasePath=aResourceType};
Orchard.UI.Resources.ResourceDefinition lResource=lResourceManager.FindResource(lSettings);
if(lResource!=null)
{
Orchard.UI.Resources.ResourceRequiredContext lContext=new Orchard.UI.Resources.ResourceRequiredContext{Resource=lResource,Settings=lSettings};
字符串lAppBasePath=System.Web.HttpRuntime.AppDomainAppVirtualPath;
返回lContext.GetResourceUrl(lSettings,lAppBasePath);
}
}
返回null;
}
}
然后你可以写:

<img src="@Html.ResourceUrl("ProfilePicture", "User1")" />

在Orchard模块视图中,为User1获取适当的图像链接

我希望这能有所帮助。

ResourceUrl()
是一个自定义的
HtmlHelper
扩展

您需要实现它的代码包含在您链接的答案中

您只需要创建一个包含方法代码的静态类


PS:请确保使用命名空间将命名空间导入到视图中,或者将其添加到
System.Web.Mvc.HtmlHelper
类中。

不,我不理解作者在一读时写的内容,ResourceUrl()是System.Web.Mvc.HtmlHelper类的所谓扩展方法。问题解决了。这看起来太过分了。将图像放在模块的Content/Images文件夹中,然后使用Url.Content有什么错?@Bertrand Le Roy按照您的建议将图像放在文件夹中,与我为模块提供的路线不相关。因此,我提出了集中资源的方法,以避免反复编写~/Modules/YourModuleName/Images/MyImage。它怎么会不起作用呢?注册资源是用于必须跨模块重用的资源,而不是为了简化路由解析。是的,一切都正确,但在Orchard中不是那么容易。我用在Orchard模块中实现此功能所需的代码更新了我的问题。@virustrity Nice one.:)