2016-01-21 29 views
7

我已经习惯了在view components MVC 6,和我几年前问一个similar question有关部分的看法。如果我构建一个视图组件来封装需要自己的Javascript的通用用例,那么我应该在哪里放置该Javascript?我知道这是dangerous at best到了Javascript的部分观点,但它是简单了很多,包括它的视图组件,而不是包含在视图或具有由包含在视图中引用一个单独的文件。我的Javascript应该用于查看组件?

例如,说我有一个有两个下拉列表视图组件。第一个下拉列表中的选择决定了第二个下拉列表中出现的项目。当然,这很容易在Javascript中处理,但我在哪里放?

回答

5

我与ASP.NET 5 View组件的经验,我会说,做他们最好的办法就是让他们孤立,在一个地方,所以他们会很容易在长期的项目管理。

在我的ASP.NET项目之一,我已经开发视图组件结构像这样的:

View Components structure

查看,后端代码和型号都在一个地方,所以当你走动该文件夹,你确定你移动整个组件。而且,当你嘲弄他们时,你可以快速访问他们所有的部分。

这将是方便易把其高度加上此种结构的成分也的JavaScript。您可以通过简单地创建组件的文件夹下的文件,然后写一个GULP TASK将JS文件复制到wwwroot的做到这一点。从这一点来说,你就能上组件的.cshtml JavaScript代码使用标准语法链接:

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

要在我的项目获得这样的结构,我已经延长剃须刀,才能够寻找我组件的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()) 
+0

从我所看到的,使用Javascript的视野组件被类似地处理谐音,但可以使用你的建议的方法或类似的东西是更加孤立。看起来好像只要我不使用范围做任何事情就可以让我的Javascript独立于查看组件。谢谢! –

+2

关于您将javascript添加到组件的方式,如果您将多个相同组件放在一个视图中,那么这不会产生问题吗?这意味着你将有多个'