Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Nancy,TinyIoC-卡在盒子里_C#_Razor_Nancy - Fatal编程技术网

C# Nancy,TinyIoC-卡在盒子里

C# Nancy,TinyIoC-卡在盒子里,c#,razor,nancy,C#,Razor,Nancy,我用Nancy已经有一段时间了,我觉得我把自己放在了一个盒子里,没有足够的思考能力去发现我用Nancy时的错误。我看到的选择我不太喜欢。如果有一些功能我错过了,有人可以帮助我,或替代方法,我没有列出很好的任何帮助将不胜感激 问题设置 我正在创建一个小的web应用程序,在这里我有正常的设备。布局页面和内容页面,甚至一些局部视图 我想创建一个动态菜单系统,根据登录的用户更改其菜单选项和总体布局。因此,主要工作是记帐的用户可能会看到更多的计费功能,进行调度的人可能会看到更多的调度功能,等等 问题本身

我用Nancy已经有一段时间了,我觉得我把自己放在了一个盒子里,没有足够的思考能力去发现我用Nancy时的错误。我看到的选择我不太喜欢。如果有一些功能我错过了,有人可以帮助我,或替代方法,我没有列出很好的任何帮助将不胜感激

问题设置 我正在创建一个小的web应用程序,在这里我有正常的设备。布局页面和内容页面,甚至一些局部视图

我想创建一个动态菜单系统,根据登录的用户更改其菜单选项和总体布局。因此,主要工作是记帐的用户可能会看到更多的计费功能,进行调度的人可能会看到更多的调度功能,等等

问题本身 问题是,我很难用Nancy和TinyIoC创建一个动态菜单

最初我想,“我只需要设置一个菜单模块和渲染,或者类似的,我就可以开始了”,除了南希不喜欢这样。那很好,因为我的选择是。。。在布局页面的代码片段中与TinyIoC对话,该代码片段将解析我的IMenuManager,我可以使用传入的用户Id或您所拥有的内容在那里调用其GenerateNu函数。我将获取返回的对象并将其传递给@Html.Partial('path',model),我是golden

除非你真的不能用这种方式和TinyIoC说话。除非是模块本身的扩展,否则您无法轻松地解析实现的接口

我考虑过的其他选择
  • 我曾考虑过使用JavaScript/jQuery对菜单模块进行AJAX调用,并以这种方式获取信息,但这感觉很糟糕,我不喜欢这样
  • 我考虑过的另一个选择是使用PageModel.MenuModel和PageModel.RealPageModel包装所有页面模型。这也让我觉得很肮脏,我不是一个粉丝

  • 有没有其他我看不到的选择?我是否必须抛弃TinyIoC,以另一种方式重新实施整个过程?

    我想你可以采取你提到的两种方法中的一种

    我倾向于使用前端框架来管理这类事情,对我来说,它要么是riot.js,要么是vue.js,但无论您使用的是angular/react等,同样的东西都适用

    基本上,您将调用端点以返回json结果,这将查看用户并调用工厂以获得基于用户信息的菜单服务,然后菜单服务将负责创建结果菜单的模型。然后,客户机将根据响应构建自己的视图


    如果您在每个请求中按下菜单,您可以使用
    RenderPartial
    执行类似操作,方法与您的模型包含基于服务结果的菜单和菜单视图的方法相同

    使用factory,创建/解析正确的服务,生成菜单,将菜单与其他所有内容一起附加到响应模型,然后渲染部分:

    @Html.Partial(Model.MenuView,Model.Menu)

    我将这种方法用于我的个人项目


    如果你需要我进一步解释,请告诉我

    如果你的需求不是太复杂,你可能会下意识地试图把事情复杂化

    你可以这样做,这是你的观点:

    @if (Html.RenderContext.Context.CurrentUser.IsAuthenticated())
    {
        if (Html.RenderContext.Context.CurrentUser.Claims.Contains("Admin"))
        {
            @Html.Partial("Views/Partials/_AdminMenu")
        }
        else if (Html.RenderContext.Context.CurrentUser.Claims.Contains("Editor"))
        {
            @Html.Partial("Views/Partials/_EditorMenu")
        }
        else if (@Html.RenderContext.Context.CurrentUser.Claims.Contains("Viewer"))
        {
            @Html.Partial("Views/Partials/_ViewerMenu")
        }
        else
        {
            @Html.Partial("Views/Partials/_PublicMenu")
        }
    }
    else
    {
        @Html.Partial("Views/Partials/_PublicMenu")
    }
    

    当然,从后端发回菜单布局更优雅。您将只有一个视图。这可能更容易实现。

    两者都不是,个人项目。@运气不好,我无法想象你为什么认为这是家庭作业。。。这显然是一个有明确目标的人在编写实际代码,他清楚地解释了问题域,以及他们迄今为止所做的尝试……在思考之后,我将看看我能做些什么,并在riot.js上运行一段时间。我希望能真正利用更多的Nancy/TinyIoC的资料,并希望在那些我忽略的图书馆里有一些东西。。。但这很好。我最糟糕的情况是剥离Nancy,改为在ASP.NETMVC下重新创建网站,然后继续前进。