2015-09-08 2 views
1

У меня есть много уровней пользовательских разрешений на моем сайте.Условное связывание ASP.NET - реализация реального мира?

Таким образом, пользователь младшего НЕ может делать то, что старшего пользователь может сделать. (есть много уровней пользователей. Старший vs junior просто для упрощения).

В дополнение на стороне сервера проверки на который пользователь и что он может/т делать - я тоже хочу НЕ предоставить Javascript функцию регистрации в первую очередь на. (Таким образом, если пользователь является младшим пользователь, то его файлы JS не должны содержать JS функции старшего пользователя.)

Примера:

Сайта имеет общий add яваскрипт функции, которая должна появиться чтобы всех пользователей:

function add() { 
    console.log("Add"); 
} 

младшие пользователи имеют более высокую привилегию, чтобы они могли также сделать subtract. так что их файлы JS включают subtract метод:

function substract() { 
    console.log("substract"); 
} 

А обычные пользователи не будут иметь этот substract метод

Старших пользователи имеют более высокую привилегию, чтобы они могли также сделать power. так что их файлы JS включают power метод:

function power() { 
    console.log("power"); 
} 

Старший пользователь не будет иметь этот метод power

OK

По this answer:

Примечание что у вас должен быть отдельный пакет на странице. Вы не должны изменять один и тот же пакет на лету .... и т.д ...

Итак, я создал (на данный момент) 2 пучков, по одному для каждой страницы:

bundles.Add(new ScriptBundle("~page1Junior").Include(
         "~/Scripts/General.js", "~/Scripts/Junior.js")); 

bundles.Add(new ScriptBundle("~page1Senior").Include(
         "~/Scripts/General.js", "~/Scripts/Senior.js")); 

и тогда я беру соответствующий пакет в соответствии с некоторым логином и использования:

<script src='@Scripts.Url("~/page1Senior (or) Junior")' async> </script> 

Вопрос

Это похоже на неправильный путь.

Если у меня есть 10 страниц и 10 пользовательских уровней, В соответствии с этим подходом, мне нужно будет разных пучки.

Что такое Право Способ обслуживания соответствующих файлов js для соответствующих разрешений пользователя?

Псевдо код, что я после:

user level  js files(combined to one) 
------------|------------- 
    1   [a,b] 
    2   [a,b,c] 
    3   [a,b,c,d] 
    4   [a,b,c,d,e] 

Так что если уровень пользователя 3 вошел в систему, а затем один abcd.js JS файл должен быть подан (уменьшенная).

+0

Почему у вас есть один пакет на каждой странице? Это само по себе, вероятно, не очень хорошо для производительности. – usr

+0

@usr Я этого не говорил. Я [ссылался] (http://stackoverflow.com/questions/11580274/visual-studio-2012-conditional-bundling/11658390#11658390) на ответ, в котором говорится, что претензии. Я открыт для новых идей. –

+0

. связки на вашем макете, тогда вам не обязательно иметь его на каждом представлении. – heymega

ответ

3

Один из способов заключается в использовании DynamicBundleFolder

Если вы можете иметь структуру каталогов, как

Scrtips 
-- /Permissions 
    -- /1 
     -- a.js 
     -- b.js 
    -- /2 
     -- a.js 
     -- b.js 
     -- c.js 
    -- /3 
     -- c.js 
     -- d.js 

где 1,2,3 уровни ограничения, то в вашем RegisterBundles добавить DynamicBundle

bundles.Add(new DynamicFolderBundle("userScripts", "*.js",new JsMinify())); 

И затем в вашем _layout.cshtml, вы можете сделать

@{ 
    var userPermissionLevel = 2; // grab your user permission level, from session maybe 
} 

@Scripts.Render("~/Scripts/Permissions/"+ @userPermissionLevel +"/userScripts") 

, который отобразит все сценарии в этом каталоге. Тогда вам не нужно создавать пакеты для каждой страницы. И если вам нужно добавить новый файл на основе разрешений, просто добавьте в соответствующую папку разрешений.

Обновление: Это будет нормально работать, если у вас есть уникальные файлы js для каждого уровня разрешений. Для общих файлов обновление их будет довольно большой работой. Так что вы можете сделать, это создать пакет в соответствии с уровнями разрешений, например

// Bundle for permission level 1 
    bundles.Add(new ScriptBundle("~/bundles/permissions/1").Include(
          "~/Scripts/a.js") 
          .Include("b.js")); 

    // Bundle for permission level 2 
    bundles.Add(new ScriptBundle("~/bundles/permissions/2").Include(
          "~/Scripts/b.js") 
          .Include("c.js")); 

    // and so on for each level 3,4,5 include specific level files 

, а затем снова вы можете добавить их к странице Повсеместно _layout.cshtml

@{ 
    var userPermissionLevel = 2; // grab your user permission level, from session maybe 
} 

@Scripts.Render("~/bundles/permissions/"+userPermissionLevel) 
+0

Существует также большое объяснение [здесь] (http://www.konstrui.nl/en/about-us/blog/daniel-plomp/2014/04/02/реализация, в-майкрософт-оптимизации-каркасные в-Dynamicweb). это все о SUFFIX. –

+0

По-прежнему существует проблема из-за нескольких клонированных файлов ... Например: A.JS не должен появляться много раз –

+0

@RoyiNamir да, вы правы. Это решение будет работать лучше всего, если у вас есть уникальные js-файлы для каждого уровня разрешений. Если у вас есть общие файлы js, управление ими будет довольно сложной задачей. – Dandy