我现在已经使用Nancy一段时间了,我想我已经把自己变成了一个盒子而且不能在外面思考,看我在使用Nancy时的错误。我确实看到的选项我不太喜欢。如果有一些功能我错过了有人可以帮助我,或者我不能很好地列出任何帮助的替代方法将非常感谢。
我正在创建一个小型的Web应用程序,我有正常的装置。布局页面和内容页面甚至几个部分视图浮动。
我想创建一个动态菜单系统,该系统会根据登录的用户更改其菜单选项和总体布局。因此,主要工作是会计的用户可能会看到更多的结算功能,安排的人可能会看到更多调度功能等。
问题是,我在使用Nancy和TinyIoC获取动态菜单时遇到了困难。
最初我想,"我只是设置了一个菜单模块,RenderAction或同等版本,我会很高兴去除#南非,不过南希并不喜欢这个。这很好,因为我的替代方案是...在一个代码片段中的布局页面上与TinyIoC交谈,该代码片段将解析我的IMenuManager,我可以通过传入的用户ID调用其GenerateMenu函数或者你有什么。我将把返回的对象传递给@Html.Partial('路径',模型)并且我是金色的
除非你真的不能以这种方式与TinyIoC交谈。除非它是Nancy模块本身的扩展,否则您无法轻松访问Resolve an Interface to a implementation。
是否存在其他一些我没有看到的选项?我是否不得不放弃TinyIoC并以另一种方式重新实现整个事情?
答案 0 :(得分:2)
我猜你可以采取两种方法中的一种,正如你所提到的那样。
我倾向于使用前端框架来管理这些类型的东西,对我来说它是riot.js或vue.js,但无论你是否使用角度/反应等同样的事情都适用
基本上你会调用一个端点来返回一个json结果,这会查看用户并调用工厂根据用户信息获取菜单服务,然后菜单服务将负责创建模型结果菜单。然后,客户端将根据响应构建自己的视图。
如果您在每次请求时按下菜单,可以使用RenderPartial
执行类似操作,则方法与您的模型包含基于服务结果的菜单和MenuView的方法相同。
使用工厂,创建/解析正确的服务,生成菜单,将菜单附加到响应模型以及其他所有内容,然后渲染您的部分:
@Html.Partial(Model.MenuView, Model.Menu)
我将此方法用于我的个人项目。
如果您需要我进一步解释,请告诉我。
答案 1 :(得分:1)
如果你的需求不是太复杂,你可能会潜意识地试图使事情过于复杂。
你可以做一些像这样的观点:
@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")
}
当然,从后端发回菜单布局更优雅。你只有一个视图。这可能更容易实现。