我的Javascript应该放在View组件的哪个位置?

时间:2016-01-21 19:31:55

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

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

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

1 个答案:

答案 0 :(得分:4)

根据我对ASP.NET 5 View Components的经验,我想说最好的办法是将它们隔离在一个地方,以便在长期项目中轻松管理。

在我的一个ASP.NET项目中,我开发了像这样的View Components结构:

View Components structure

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

在这样的结构中放置与组件高度耦合的JavaScript将是方便的。您只需在组件文件夹下创建文件,然后编写将JS文件复制到wwwroot的 GULP TASK 即可。从那时起,您将能够使用标准语法链接组件的.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())