3

我想从配方中创建以下别名。

别名

这是如何实现的?

4

1 回答 1

0

我创建了这个类来为 Orchard 添加一个命令,以从命令行或配方创建一个新的别名:

using Orchard;
using Orchard.Alias;
using Orchard.Commands;
using System;
using Orchard.Environment;
using System.Linq;

namespace Contrib.Foundation.Common.Commands
{
    public class AliasCommands : DefaultOrchardCommandHandler
    {
        private readonly Work<WorkContext> _workContext;
        private readonly IAliasService _aliasService;

        public AliasCommands(Work<WorkContext> workContext, IAliasService aliasService,
            IOrchardServices orchardServices)
        {
            _workContext = workContext;
            _aliasService = aliasService;
            Services = orchardServices;
        }
        public IOrchardServices Services { get; private set; }

        [OrchardSwitch]
        public string AliasPath { get; set; }
        [OrchardSwitch]
        public string RoutePath { get; set; }

        [CommandName("alias add")]
        [CommandHelp("alias add /AliasPath:<alias-path> /RoutePath:<route-path>\r\n\t" + "Add a new alias")]
        [OrchardSwitches("AliasPath,RoutePath")]
        public void Add()
        {
            AliasPath = AliasPath.TrimStart('/', '\\');
            if (String.IsNullOrWhiteSpace(AliasPath))
            {
                AliasPath = "/";
            }
            if (String.IsNullOrWhiteSpace(RoutePath))
            {
                Context.Output.WriteLine(T("Route can't be empty"));
                return;
            }       
            if (CheckAndWarnIfAliasExists(AliasPath))
            {
                Context.Output.WriteLine(T("Alias already exist"));
                return;
            }
            try
            {
                _aliasService.Set(AliasPath, RoutePath, "Custom");
            }
            catch (Exception ex)
            {
                Services.TransactionManager.Cancel();
                Context.Output.WriteLine(T("An error occured while creating the alias {0}: {1}. Please check the values are correct.", AliasPath, ex.Message));
                return;
            }
            Context.Output.WriteLine(T("Alias {0} created.", AliasPath));
        }
        private string GetExistingPathForAlias(string aliasPath)
        {
            var routeValues = _aliasService.Get(aliasPath.TrimStart('/', '\\'));
            if (routeValues == null) return null;

            return _aliasService.LookupVirtualPaths(routeValues, _workContext.Value.HttpContext)
                .Select(vpd => vpd.VirtualPath)
                .FirstOrDefault();
        }
        private bool CheckAndWarnIfAliasExists(string aliasPath)
        {
            var routePath = GetExistingPathForAlias(aliasPath);
            if (routePath == null) return false;

            return true;
        }
    }
}

你可以在这样的食谱中使用它:

<Command>
alias add /AliasPath:"/" /RoutePath:"mycontroller"
</Command>

将类放在模块中并引用 Orchard.Alias

于 2016-04-07T12:12:54.647 回答