Вот краткое изложение. Пользователи могут просматривать бритвенные страницы как анонимно, так и вошедшие в систему. Если они вошли в систему, они получают определенные функции. В моем контроллере у меня есть логическое значение 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);
}
})
}
}
})
}
}