Использование await в Razor Views

Я использую утилиту Closure-Compiler для обфускации java-скрипта. Он минимизирует код и имеет больше возможностей для обфускации. Эта утилита доступна в коде Google по адресу ниже: Инструменты закрытия

Но теперь дни, когда я слышу большую часть UglifyJS. Вы можете найти различное сравнение между Closure Compiler и UglifyJS, в котором Uglify кажется победителем. UglifyJS: быстрый новый компрессор JavaScript для Node.js, который находится на грани с закрытием

Вскоре я бы дал шанс UglifyJS.

28
задан Knaģis 4 October 2013 в 13:23
поделиться

3 ответа

Нет, это невозможно, и вам все равно не нужно это делать. Бритвенные представления должны содержать разметку и, самое большее, некоторый вспомогательный вызов. async / await принадлежит вашей бэкэнд-логике.

14
ответ дан Darin Dimitrov 4 October 2013 в 13:23
поделиться

Я давно хотел что-то подобное - многие страницы, которые мы пишем, могли бы быть сгенерированы младшим разработчиком, если бы им не нужно было писать кучу запросов; и, в любом случае, это один и тот же базовый шаблонный запрос - зачем им писать их для каждого контроллера, когда большая часть их работы состоит в том, чтобы получить контент? Я использую C #, поэтому мне не приходится иметь дело с управлением памятью. Почему HTML-кодер должен иметь дело с деталями запроса?

Существует способ, позволяющий неявно загружать данные асинхронно в View. , Сначала вы определяете класс, который выражает, какие данные вы хотите. Затем в верхней части каждого представления создайте экземпляр этого класса. Вернувшись в контроллер, вы можете найти представление, которое, как вы знаете, собираетесь использовать, открыть его, а затем скомпилировать этот класс . Затем вы можете использовать его, чтобы получить данные, необходимые представлению, асинхронно, в контроллере, как это обеспечивает MVC. Наконец, передайте его с помощью ViewModel в View, как предписывает MVC, и, через некоторую хитрость, у вас будет View, который объявляет, какие данные он собирается использовать.

Вот StoryController. Младшие разработчики пишут истории в виде простых файлов .cshtml, не зная, что такое контроллер, база данных или LINQ:

public class StoryController : BaseController
{
    [OutputCache(Duration=CacheDuration.Days1)]
    // /story/(id)
    public async Task<ActionResult> Id(string id = null)
    {
        string storyFilename = id;

        // Get the View - story file
        if (storyFilename == null || storyFilename.Contains('.'))
            return Redirect("/");   // Disallow ../ for example

        string path = App.O.AppRoot + App.HomeViews + @"story\" + storyFilename + ".cshtml";
        if (!System.IO.File.Exists(path))
            return Redirect("/");

        return View(storyFilename);

Пока все, что нужно сделать, это получить файл View на основе URL, что-то вроде Веб-формы (за исключением внутри MVC и с использованием Razor). Но мы хотим показать некоторые данные - в нашем случае, людей и проекты, которые накапливаются в базе данных - с некоторыми стандартными ViewModels и Partials. Давайте определимся как и скомпилируем это. (Обратите внимание, что в моем случае ConservX является основным пространством имен Project).

    public async Task<ActionResult> Id(string id = null)
    {
        string storyFilename = id;

        // 1) Get the View - story file
        if (storyFilename == null || storyFilename.Contains('.'))
            return Redirect("/");   // Disallow ../ for example

        string path = App.O.AppRoot + App.HomeViews + @"story\" + storyFilename + ".cshtml";
        if (!System.IO.File.Exists(path))
            return Redirect("/");

        // 2) It exists - begin parsing it for StoryDataIds
        var lines = await FileHelper.ReadLinesUntilAsync(path, line => line.Contains("@section"));

        // 3) Is there a line that says "new StoryDataIds"?
        int i = 0;
        int l = lines.Count;
        for (; i < l && !lines[i].Contains("var dataIds = new StoryDataIds"); i++)
        {}

        if (i == l) // No StoryDataIds defined, just pass an empty StoryViewModel
            return View(storyFilename, new StoryViewModel());


        // https://stackoverflow.com/questions/1361965/compile-simple-string
        // https://msdn.microsoft.com/en-us/library/system.codedom.codecompileunit.aspx
        // https://msdn.microsoft.com/en-us/library/system.codedom.compiler.codedomprovider(v=vs.110).aspx
        string className = "__StoryData_" + storyFilename;
        string code = String.Join(" ",
            (new[] {
                "using ConservX.Areas.Home.ViewModels.Storying;",
                "public class " + className + " { public static StoryDataIds Get() {"
            }).Concat(
                lines.Skip(i).TakeWhile(line => !line.Contains("};"))
            ).Concat(
                new[] { "}; return dataIds; } }" }
            ));


        var refs = AppDomain.CurrentDomain.GetAssemblies();
        var refFiles = refs.Where(a => !a.IsDynamic).Select(a => a.Location).ToArray();
        var cSharp = (new Microsoft.CSharp.CSharpCodeProvider()).CreateCompiler();
        var compileParams = new System.CodeDom.Compiler.CompilerParameters(refFiles);
        compileParams.GenerateInMemory = true;
        compileParams.GenerateExecutable = false;

        var compilerResult = cSharp.CompileAssemblyFromSource(compileParams, code);
        var asm = compilerResult.CompiledAssembly;
        var tempType = asm.GetType(className);
        var ids = (StoryDataIds)tempType.GetMethod("Get").Invoke(null, null);

        using (var db... // Fetch the relevant data here

        var vm = new StoryViewModel();
        return View(storyFilename, vm);
    }

Это большая часть работы. Теперь младшие разработчики могут просто объявить необходимые данные следующим образом:

@using ConservX.Areas.Home.ViewModels.Storying
@model StoryViewModel
@{
    var dataIds = new StoryDataIds
    {
        ProjectIds = new[] { 4 }
    };

    string title = "Story Title";
    ViewBag.Title = title;
    Layout = "~/Areas/Home/Views/Shared/_Main.cshtml";
}
@section css {
...
1
ответ дан Chris Moschini 4 October 2013 в 13:23
поделиться

Можно ли ждать вызовов на страницах бритвы? У меня есть приложение Blazor, и большинство моих методов асинхронно:

страница Razor:

<MatFAB Icon="@MatIconNames.Autorenew" Style="transform:scale(0.8); background:#333;"
                OnClick="@(async () => await OnInitializedAsync())"></MatFAB>

Это - MatBlazor FloatingActionButton, который называет пожизненное событие OnInitializedAsync цикла ()

Код C#:

protected override async Task OnInitializedAsync()
{
    // Do something like get data when the form loads
}
0
ответ дан 27 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: