C # Razor Просмотр передачи нулевого объекта в JavaScript - PullRequest
0 голосов
/ 01 ноября 2018

Вот краткое изложение. Пользователи могут просматривать бритвенные страницы как анонимно, так и вошедшие в систему. Если они вошли в систему, они получают определенные функции. В моем контроллере у меня есть логическое значение isAnonymous, для которого я установил значение true или false в зависимости от того, вошел ли пользователь в систему или нет. Я передаю isAnonymous моей модели вида, которая отправляется на страницу бритвы.

На странице бритвы у меня есть тег сценария javascript, который должен получить это логическое значение, и, если isAnonymous имеет значение false (что означает, что кто-то вошел в систему), отключить один из двух вызовов ajax на сервер.

Первое, что я делаю в своем теге script, - это получить значение isAnonymous и преобразовать его в логическое значение JavaScript с помощью этого:

var isAnonymous = @Json.Encode(Model.IsAnonymous);

после входа в консоль, это, кажется, возвращается правильно.

Тогда я вставил свое утверждение if. Суть здесь в том, что если пользователь не вошел в систему, ни одна из этих функций, вложенных в оператор if, не должна запускаться, потому что они принимают ApplicationUser как часть модели. Если пользователь не вошел в систему, Model.User имеет значение null и выдает Null Reference Exception. Я думал, что размещение моих вызовов ajax внутри оператора if защитит от исключения, но логика, кажется, проходит сквозь if (isAnonymous == false) и поражает эти функции, несмотря на логику. Есть мысли о том, почему это происходит? Когда isAnonymous истинно, я не могу запускать функции.

if (isAnonymous == false) {
    if ($('.bookmark-btn').hasClass('bookmark-story-btn')) {
        addBookmark();
    } else {
        removeBookmark();
    }

    function addBookmark() {
    //bookmark a story btn click event
    $('.bookmark-story-btn').on('click', function () {

        var storyid;

        //the storyid should come as a string - 
        //try to parse it as an int for the controller
        if (!isNaN($(this).attr('storyid'))) {

            storyid = parseInt($(this).attr('storyid'))
            //verify successful conversion from string to int before ajax call
            if (typeof (storyid) == 'number') {
                var userid = $(this).attr('userId')

                var newBookmark = {
                                    UserId: userid,
                                    StoryId: storyid,
                                  };

                $.ajax({
                    url: "/api/bookmark/new",
                    method: "POST",
                    data: newBookmark,
                    success: function (data) {
                            //remove the save bookmark btn and dynamically add
                            //the remove bookmark btn so 
                            //the page doesn't require a refresh
                            $('.bookmark-story-btn').remove();
                            $('.bookmark-btn-group').append("<button bookmarkId='" 
                                + data.Id 
                                + "' userId=@Model.User.Id storyId=@Model.StoryId"
                                +" class='btn remove-bookmark-btn bookmark-btn'>"
                                +"<i class='fas fa-2x fa-bookmark'></i></button>")
                            removeBookmark();
                        },
                    error: function (error) {
                            $('.page-alert').css('visibility', 'visible')
                                .html("Whoops. Something went wrong."
                                        +" Adding the bookmark failed.")
                            //automatically close the alert-danger div 
                            //after 2 seconds
                            setTimeout(function () {
                                $('.page-alert').css('visibility', 'hidden')
                            }, 3000);
                        }
                    });
                }
            }
        });
    }

    function removeBookmark() {
        //remove a bookmark click event
        $('.remove-bookmark-btn').on('click', function () {

            if (!isNaN($(this).attr('bookmarkid'))) {
                bookmarkid = parseInt($(this).attr('bookmarkid'))
                //verify successful conversion from string to int before ajax call
                if (typeof (bookmarkid) == 'number') {

                    //call the ajax
                    $.ajax({
                        url: "/api/bookmark/" + bookmarkid,
                        method: "DELETE",
                        success: function (data) {
                            //show-hide the appropriate icons
                            $('.remove-bookmark-btn').remove();
                            $('.bookmark-btn-group').append("<button userId=@Model.User.Id"
                                +" storyId=@Model.StoryId class='btn bookmark-story-btn"
                                +" bookmark-btn'><i class='far fa-2x fa-bookmark'>"
                                +"</i></button>")
                            addBookmark();
                        },
                        error: function (error) {
                            $('.page-alert').css('visibility', 'visible')
                                    .html("Whoops. Something went wrong here."
                                        +" Removing the bookmark didn't work.")
                            //automatically close the alert-danger div 
                            //after 2 seconds
                            setTimeout(function () {
                                $('.page-alert').css('visibility', 'hidden')
                            }, 3000);
                        }
                    })
                }
            }
        })
    }
} 

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете использовать Request.IsAuthenticated в обоих видах Razor:

@if(Request.IsAuthenticated)
{
    <script>
        ' your authenticated client side script here
    </script>
}

А затем проверьте снова на стороне сервера при публикации в вашем контроллере, например:

    public ActionResult Index()
    {
        if(Request.IsAuthenticated)
        {
            //server logic here
        }
    }

Еще лучше, если вы украсите метод с помощью AuthoriseAttribute, пользователь получит 403. Несанкционированный.

Затем вы можете сделать что-то похожее на стороне сервера для UserId:

    [Authorize]
    public ActionResult Index()
    {
        var userId = User.Identity.Name;
    }

Тогда вам даже не нужно передавать идентификатор пользователя. Все это основано на использовании общих методов идентификации:

https://docs.microsoft.com/en-us/aspnet/identity/overview/getting-started/introduction-to-aspnet-identity

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...