Zmienna globalna z widoku do pliku JS

0

Witajcie.
Mam pewien problem. Bawię się trochę C# i JS. Mam widok, w którym mam pewne deklaracje zmiennych. Chciałbym te zmienne przenieść do kodu Javascript, który znajduje się w osobnym pliku. Nie przekazuje mi jednak tych zmiennych, są one puste. Gdy kod Javascript mam pod widokiem w tagach Script to wszystko jest ok. Fragemnty kodu poniżej

Widok

 @model App.Models.User.UserModel

@using App.Data.Extensions

@{
    var ViewMode = Model.ViewMode;
}

<script src="~/Scripts/User.js"></script>

fragment kodu z pliku User.js

function ShowDiv() {
    var view = "@ViewMode"

    if (view == "Edit") {
        $('#changepass').show();
        $('#pass').hide();
        RemoveRequiredRule('#NewPassword');
        RemoveRequiredRule('#ConfirmPassword');
    }
    else {
        $('#changepass').hide();
        $('#pass').show();
        AddRequiredRule('#NewPassword', 'Podaj hasło');
        AddRequiredRule('#ConfirmPassword', 'Podaj hasło');
    }
}
window.onload = ShowDiv; 
0

var view = "@ViewMode" miałoby być wypełnione wartością? Pliki js nie są parsowane przez serwer, albo inaczej: Razor kompiluje tylko pliki cshtml. Rozwiązanie w Twoim przypadku jest banalne - w .js function initPasswordInputs(mode) { ... }', w .cshtml $(function() { initPasswordInputs("@ViewMode"); });`. Sytuacja komplikuje się, jeśli masz więcej parametrów do przekazania, ale Ty masz tylko jeden.

BTW w js standardem nazywania elementów jest camel case, ale z pierwszą literką małą. Dlatego showDiv. A ponieważ showDiv kompletnie nic nie mówi, ba, nazwa sugeruje, że funkcja coś pokaże, a tymczasem funkcja coś pokazuje, ale też coś ukrywa i dodaje jakieś reguły - to initPasswordInputs wydaje mi się dużo bardziej adekwatna. Tak samo AddRequiredRule powinno mieć nazwę addRequiredRule. Ponadto nie używaj window.onload: 1) korzystasz z jQuery, to bądź konsekwentny; 2) źle korzystasz z tej metody (nie zapamiętujesz i nie wywołujesz potencjalnej pierwotnej metody podczepionej pod window.onload).
I jeszcze jedna uwaga - jako ViewModel przekaż enum, a nie string, unikniesz w ten sposób literówek, a w przyszłości ewentualny refactoring będzie łatwiejszy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1