Asp.net частичный просмотр — настройка html и css после нажатия — не изменение его состояния

#javascript #jquery #asp.net-mvc #partial-views

#javascript #jquery #asp.net-mvc #частичные просмотры

Вопрос:

Asp.net частичный просмотр — настройка html и css после нажатия — не изменение его состояния

У меня есть родительский вид со встроенным частичным видом (большие пальцы и графы).

Частичный просмотр имеет 2 больших пальца и 2 счета.

введите описание изображения здесь

Большой палец вверх отключен и имеет значение count = 1. Также зеленый, чтобы указать, что он был ранее выбран. Палец вниз включен и имеет значение count = 0. Также черный, чтобы указать, что он может быть выбран.

Когда я нажимаю на палец вниз, я выполняю функцию JavaScript, которая вызывает метод действия контроллера для соответствующей настройки счетчиков в базе данных, устанавливает переменные сеанса и возвращает частичное представление с обновленной моделью представления. На этом этапе я бы ожидал, что представление изменит свое состояние — количество и отключит / включит соответствующие большие пальцы.

Однако это не так. Почему? Это НЕ отражает количество (в html) и не возвращается в $ (document).ready(функция (), которая выполняет функции для установки соответствующих визуальных изменений для больших пальцев (отключить / включить и изменить цвет).

Итак, вместо этого я выбрал 2-й подход. После успешного вызова метода action я использую переменные сеанса в функциях JavaScript для отражения количества (в html) и для установки соответствующих визуальных изменений для больших пальцев (отключить / включить и изменить цвет).). Я вижу, что я бросил и выполнил настройки. Все они являются правильными значениями и применяются, но изменение состояния не отражается на частичном представлении.

Почему он не принимает настройки — обновите частичный просмотр, чтобы отразить количество и отключить / включить соответствующий thumb.?

введите описание изображения здесь

Я бы ожидал, что частичный просмотр будет выглядеть так, как показано ниже. Большой палец вверх включен и количество = 0, а большой палец вниз — количество = 1 и отключен.

введите описание изображения здесь


Вот частичный просмотр:

 @model GbngWebClient.Models.LikeOrDislikeVM

<style>
.fa {
    cursor: pointer;
    user-select: none;
}

    .fa:hover {
        color: blue;
    }

/* I added. */
.my-size {
    font-size: 20px;
}

.my-button {
    border: none;
    padding: 8px 10px;
    float: left;
    font-size: 16px;
    margin: 4px 2px;
    background-color: white;
}
</style>


<div class="row">
    <div>
        <button class="blogLike my-button fa fa-thumbs-up"><span class="my-size, likeCount"> : @Model.LikeCount </span></button>
        <button class="blogDisLike my-button fa fa-thumbs-down"><span class="my-size, dislikeCount"> : @Model.DisLikeCount</span></button>
    </div>
</div>

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@Styles.Render("~/Content/css")

<script type="text/javascript">
    $(document).ready(function () {
        // For testing:
        console.log('Here at ready. ');

        // JavaScript needs it as 'false'. So using these 'const' to convert them.
        const False = false, True = true;

        // Set the initial disabled attributes and color.
        SetLike(@Model.LikeDisabled);
        SetDisLike(@Model.DisLikeDisabled);

        // For when clicking the BlogLike thumb.
        $('.blogLike').on('click', function () {
            // Call the BlogPublished controllers action method to set the blog's LikeCount.
                 
            $.ajax({
                type: 'POST',
                data: { likeOrDislikeIndicator: "L" },
                success: function (response) {
                    // Call to the server side to get the session variable and then set the HTML.
                    GetSessionVarAndSetHtml("LikeDisabled");
                    GetSessionVarAndSetHtml("DisLikeDisabled");
                    GetSessionVarAndSetHtml("LikeCount");
                    GetSessionVarAndSetHtml("DisLikeCount");
                },
                error: function (xhr, ajaxOptions, thrownError) {
                   alert("Critical Error");
                }
            })
        });

        // For when clicking the BlogDisLike.
        $('.blogDisLike').on('click', function () {
            // Call the BlogPublished controllers action method to set the blog's DisLikeCount.
        
            $.ajax({
                type: 'POST',
                url: '@Url.Action("SetBlogLikeOrDisLike", "BlogPublished")',
                data: { likeOrDislikeIndicator: "D" },
                success: function (response) {
                    // Call to the server side to get the session variable and then set the HTML.
                    GetSessionVarAndSetHtml("LikeDisabled");
                    GetSessionVarAndSetHtml("DisLikeDisabled");
                    GetSessionVarAndSetHtml("LikeCount");
                    GetSessionVarAndSetHtml("DisLikeCount");
                },
                error: function (xhr, ajaxOptions, thrownError) {
                   alert("Critical Error");
                }
            })
        });

        //-----------------------------------------------------------------------------------------
        // Call to the server side to get the session variables. Then set the Html accordingly.
        //-----------------------------------------------------------------------------------------
        function GetSessionVarAndSetHtml(toBeProcessed) {
            // For testing:
            console.log('Here at GetSessionVarAndSetHtml. ');

             $.ajax({
                type: 'GET',
                url: '@Url.Action("GetSessionVar", "BlogPublished")',
                data: { toBeProcessed: toBeProcessed },
                success: function (response) {
                   console.log('Response:  '   response);

                    if (toBeProcessed == "LikeDisabled")
                    {
                       // Set the Html. Response will be either true or false.
                       SetLike(response);
                    };

                    if (toBeProcessed == "DisLikeDisabled") {
                        // Set the Html. Response will be either true or false.
                        SetDisLike(response);
                    };

                    if (toBeProcessed == "LikeCount") {
                        // Set the Html. Response will be an integer.
                        SetLikeCount(response);
                    };

                    if (toBeProcessed == "DisLikeCount") {
                        // Set the Html. Response will be an integer.
                        SetDisLikeCount(response);
                    };
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert("Critical Error");
             }
           })
        }

        //--------------------------------------------------------------------------------------
        // Set the disabled attribute to true or false and set color.
        //--------------------------------------------------------------------------------------
        function SetLike(disabledSwitch) {
            // For testing:
            console.log('Here at Setlike. '   disabledSwitch);

            $(".blogLike").attr('disabled', disabledSwitch);

            if (disabledSwitch == true )
            {
                // Show by color that it was liked.
                $(".blogLike").css('color', 'green');
            }

            if (disabledSwitch == false)
            {
                // Show by color that it can be clicked.
                $(".blogLike").css('color', 'black');
            }
        }

        //--------------------------------------------------------------------------------------
        // Set the disabled attribute to true or false and set color.
        //--------------------------------------------------------------------------------------
        function SetDisLike(disabledSwitch) {
            // For testing:
            console.log('Here at SetDisLike. '   disabledSwitch);

            $(".blogDisLike").attr('disabled', disabledSwitch);

            if (disabledSwitch == true)
            {
                // Show by color that it was disliked.
                $(".blogDisLike").css('color', 'green');
            }

            if (disabledSwitch == false)
            {
                // Show by color that it can be clicked.
                $(".blogDisLike").css('color', 'black');
            }
        }

        //--------------------------------------------------------------------------------------
        // Set the like count.
        //--------------------------------------------------------------------------------------
        function SetLikeCount(count) {
            // For testing:
            console.log('Here at SetLikeCount. '   count);

            $(".likeCount").val(count);
        }

        //--------------------------------------------------------------------------------------
        // Set the dislike count.
        //--------------------------------------------------------------------------------------
        function SetDisLikeCount(count) {
            // For testing:
            console.log('Here at SetDisLikeCount. '   count);

            $(".dislikeCount").val(count);
        }
    });
</script>
  

Вот метод действия:

     [HttpPost]
    public async Task<ActionResult> SetBlogLikeOrDisLike(string likeOrDislikeIndicator)
    {
        BLL_BlogPublished bll_BlogPublished = new BLL_BlogPublished();

        SetBlogLikeOrDisLikeResult setBlogLikeOrDisLikeResult = new SetBlogLikeOrDisLikeResult();

        LikeOrDislikeVM likeOrDislikeVM = new LikeOrDislikeVM();

        try
        {
            // Update the 'like count' or 'dislike count' in the Blog table and (update/insert) a corresponding entry in the UserBlogPreference table.
            setBlogLikeOrDisLikeResult = await bll_BlogPublished.SetBlogLikeOrDisLike(Convert.ToInt32(Session["BlogId"]), Convert.ToInt32(Session["UserId"]), Session["UserName"].ToString(), likeOrDislikeIndicator);

            // Check if an error occurred in the web api.
            if (setBlogLikeOrDisLikeResult.ApiErrorMessage == null)
            {
                 if (setBlogLikeOrDisLikeResult.Status == 1)
                {
                    //  Set these view model properties model from session variables.
                    likeOrDislikeVM.BlogId = Convert.ToInt32(Session["BlogId"]);
                    likeOrDislikeVM.UserId = Convert.ToInt32(Session["UserId"]);

                    // Set these view model properties from what was returned.
                    likeOrDislikeVM.LikeCount = setBlogLikeOrDisLikeResult.LikeCount;
                    likeOrDislikeVM.DisLikeCount = setBlogLikeOrDisLikeResult.DisLikeCount;
                    likeOrDislikeVM.LikeDisabled = setBlogLikeOrDisLikeResult.LikeDisabled;
                    likeOrDislikeVM.DisLikeDisabled = setBlogLikeOrDisLikeResult.DisLikeDisabled;

                    // Set the session variables that will be used in the partial view.
                    SetIntegerSessionVar("LikeCount", setBlogLikeOrDisLikeResult.LikeCount);
                    SetIntegerSessionVar("DisLikeCount", setBlogLikeOrDisLikeResult.DisLikeCount);
                    SetBooleanSessionVar("LikeDisabled", setBlogLikeOrDisLikeResult.LikeDisabled);
                    SetBooleanSessionVar("DisLikeDisabled", setBlogLikeOrDisLikeResult.DisLikeDisabled);
                }
                else if (setBlogLikeOrDisLikeResult.Status == 2)
                {
                    ViewBag.errormessage = "Process Violation: The blog does not exist.";
                }
                else if (setBlogLikeOrDisLikeResult.Status == 3)
                {
                    ViewBag.errormessage = "Process Violation: The user does not exist.";
                }
                else if (setBlogLikeOrDisLikeResult.Status == 4)
                {
                    ViewBag.errormessage = "Process Violation: An invalid value for the preference type.";
                }
            }
            else
            {
                 ViewBag.errormessage = setBlogLikeOrDisLikeResult.ApiErrorMessage;
            }
        }
        catch (Exception ex1)
        {
            exceptionMessage = "Server error on setting the blog like count. Please contact the administrator.";

            try
            {
                ...
            }
            catch (Exception ex2)
            {
                ...
            }
        }

        // Return the partial view with the view model.
        // - This will contain valid data, an error or a web api error message.            
        return PartialView("~/Views/BlogPublished/_BlogLikeAndDislike.cshtml", likeOrDislikeVM);
    }
  

Комментарии:

1. Ваш дизайн действия / представления выглядит немного странно. HttpPost SetBlogLikeOrDisLike должен просто возвращать обновленное количество лайков / дизлайков и использовать jQuery для отображения количества в HTML. Я думаю, Session в этом нет необходимости.

2. Li-Jyu … Здесь есть 2 подхода. Первое — это то, что я ожидаю от работы, и мне не нужно использовать 2-й, который использует переменные сеанса. 1-й возвращает обновленную модель представления. На этом этапе я бы ожидал, что представление обновит себя с помощью обновленной модели представления и изменит свое состояние — количество и отключит / включит соответствующие большие пальцы. Это не так. Он не вводит $ (document). ready(функция (), которая снова начнет создавать представление.

3. Li-jyu .. Я слышал, что вы не используете переменные сеанса во 2-м подходе, но я использую jQuery для отображения количества и установки цвета, но jQuery не работает. Я вижу, что я бросил и выполнил настройки. Все они являются правильными значениями и применяются, но изменение состояния не отражается на частичном представлении.

4. Я не думаю, что в этом случае val сработает установка счетчиков, поскольку вы не устанавливаете значение элемента формы (количество указано в промежутках) — попробуйте html вместо этого установить innerHtml значение элемента.

5. измените эти $(".dislikeCount").text(count); и $(".likeCount").text(count);

Ответ №1:

Короче говоря: используйте, text() но не val() , когда вы хотите изменить содержимое <span> .

Итак, это ваш js-код:

 function SetLikeCount(count) {
  // For testing:
  console.log('Here at SetLikeCount. '   count);
  $(".likeCount").val(count);
}
  

И это соответствующий html:

 <span class="my-size, likeCount"> : @Model.LikeCount </span>
  

Если вы можете получить правильное значение count в console.log() , но не в .val() функции, это проблема .val() функции. Не ваши вызовы API.

В официальной документации от jQuery указано, когда использовать val() :

Метод .val() в основном используется для получения значений элементов формы, таких как input , select и textarea . При вызове пустой коллекции он возвращается undefined .

Поскольку вы вызываете val() в span элементе, ничего не изменится.

Вместо этого вы должны использовать text() или html() . Например:

 $(".likeCount").text(count);
  

Удачи!