【问题标题】:Where should my Javascript go for View Components?我的 Javascript 应该去哪里查看组件?
【发布时间】:2016-04-28 05:26:13
【问题描述】:

我已经习惯了 MVC 6 中的 view components,几年前我问过 similar question 关于部分视图的问题。如果我构建一个视图组件,它封装了一个需要自己的 Javascript 的常见用例,我应该把那个 Javascript 放在哪里?我知道在部分视图中包含 Javascript 是 dangerous at best,但是将其包含在视图组件中会简单得多,而不是包含在包含视图或必须由包含视图引用的单独文件中。

例如,假设我有一个包含两个下拉列表的视图组件。第一个下拉列表中的选择决定了第二个下拉列表中显示的项目。当然,这在 Javascript 中很容易处理,但是我应该把它放在哪里呢?

【问题讨论】:

    标签: javascript c# asp.net-core asp.net-core-viewcomponent


    【解决方案1】:

    根据我使用 ASP.NET 5 视图组件的经验,我认为最好的办法是将它们隔离在一个地方,以便在长期项目中轻松管理它们。

    在我的一个 ASP.NET 项目中,我开发了如下视图组件结构:

    视图、后端代码和模型都在一个位置,因此当您在文件夹中移动时,您可以确定您移动了整个组件。此外,当您修改它们时,您可以快速访问它们的所有部分。

    将与组件高度耦合的JavaScript也放在这样的结构中会很方便。您可以通过简单地在组件文件夹下创建文件,然后编写一个 GULP TASK 将 JS 文件复制到 wwwroot 来做到这一点。从那时起,您将能够使用标准语法在组件的 .cshtml 上链接该 JavaScript 代码:

    <script src="~/Components/yourcomponent.js"></script>
    

    为了在我的项目中获得这样的结构,我扩展了 Razor,以便能够在适当的位置搜索我的组件的 CSHTML。为此,我在 Startup.cs 中添加了以下代码:

    public partial class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
           //non relevant code skipped
           services.AddMvc().AddRazorOptions(ConfigureRazor);
    
        }
    
        public void ConfigureRazor(RazorViewEngineOptions razor)
        {
            razor.ViewLocationExpanders.Add(new ViewLocationExpander());
        }
    }
    

    ViewLocationExpander 类是:

    public class ViewLocationExpander : IViewLocationExpander
    {
        protected static IEnumerable<string> ExtendedLocations = new[]
        {
            "/{0}.cshtml"
        };
    
        public void PopulateValues(ViewLocationExpanderContext context)
        {
            //nothing here
        }
    
        public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
        {
            //extend current view locations
            return viewLocations.Concat(ExtendedLocations);
        }
    }
    

    然后,您像这样调用组件(从任何 .cshtml 视图):

    @await Component.InvokeAsync("NavigationComponent",new NavigationComponentModel())
    

    【讨论】:

    • 据我所见,视图组件中的 Javascript 的处理方式与部分类似,但使用您建议的方法或类似方法可以更加隔离。只要我不对范围做任何愚蠢的事情,就可以隔离我的 Javascript 以查看组件。谢谢!
    • 关于将 javascript 添加到组件的方式,如果您在一个视图中放置多个相同的组件,这不会产生问题吗?这意味着您将拥有多个具有相同来源的&lt;script&gt; 标签,还是我错过了什么?
    • 是的,这很好,但是它很容易处理,即如果之前使用过该组件,则保存临时 bool 标志
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多