Как выполнить функцию JavaScript при загрузке PartialView в MVC 3

\\code
public ActionResult mapPartial(DataTable dt)
        {
            string strEvents = "[";
            foreach (DataRow row in dt.Rows)
            {
                strEvents += "[" + row["Lat"].ToString() + ", " + row["Long"].ToString() + ", " + "\"" +
                row["LastName"].ToString() + row["DateOfBirth"].ToString() + "\"" + "],";
            }
            strEvents = strEvents.Remove(strEvents.LastIndexOf(","));
            strEvents += "]";

            ViewBag.locpoints = strEvents;

            return PartialView(dt);
        }

//in the partial view page
<script type="text/javascript">
       function mapInit(Viewbag.locpoints) {

              var arr = $.parseJSON(Viewbag.locpoints);
              //more code which assigns a map to div map below 
       }
</script>

<div id="map" class="map"></div>

Как я могу сразу вызвать функцию JS для рендеринга моей карты при загрузке частичного представления. Частичный метод в контроллере возвращает строку, которая используется как параметр в функции JS. Надеюсь, это имеет смысл.

Ответ 1

Поскольку вы, кажется, используете JQuery, почему бы и нет:

<script type="text/javascript">
       $(document).ready(function(){
              var arr = $.parseJSON("@Viewbag.locpoints");
              //more code which assigns a map to div map below 
       });
</script>

Я также изменил то, как вы ссылались на свое значение ViewBag, так как оно у вас есть, это не будет строковым литералом в JavaScript.

Кроме того, в качестве дополнительной заметки рассмотрим использование JSON-сериализатора для преобразования ваших данных в JSON. Это считается плохой практикой делать это вручную, как вы делали это выше.

Ответ 2

После того, как вы определите его, вы просто вызываете его. Однако похоже, что вы включаете значения MVC Viewbag в определение функции JS. Вы должны передавать эти значения при вызове метода JS:

<script type="text/javascript">
       function mapInit(locPoints) {    
              var arr = $.parseJSON(locPoints);
              //more code which assigns a map to div map below 
       }
       mapInit(@(Viewbag.locpoints));
</script>

Примечание. Предполагается, что вы загрузили jQuery.

Ответ 3

Попробуйте вызвать контроллер через JQuery.

$(document).ready(function () {
 $.ajax({
            type: 'GET',
            url: 'your_controller_url',
            success: function (data) {

                //Do your stuffs here
            }
        });
}

Ответ 4

Рассмотрите возможность использования опции onSuccess Ajax и подключите функцию javascript, где написан ваш jquery. Например, у вас есть следующий script, написанный в вашем mainView, который вызывает частичный вид. Предположим, вы хотите что-то сделать, когда щелкнуть тег привязки в вашем частичном представлении

var fromPartial=function()
            {
                var v = $(this).closest("div");
                var mId = v.attr('id');
                if (mId == 'divDetail') {
                    event.preventDefault();
                    //what you want to achieve
                }
            }

Теперь в вашем частичном представлении тег привязки создается, как показано ниже.

           @Ajax.ActionLink("Select", "AssignSpeaker", new { 
        conferenceId = ViewBag.ConferenceId, sessionId = session.Id },
                                 new AjaxOptions() { HttpMethod="Get",
     InsertionMode= InsertionMode.Replace, UpdateTargetId="yourTarget",
 OnSuccess="fromPartial" })

Ответ 5

Мы реализовали гораздо более простое решение.

_Layout.cshtml после @RenderSection("scripts", required: false) (и JQuery и т.д.)

<script>
    $(document).ready(function () { if (typeof partialScript !== "undefined") partialScript();});
</script>

Затем в вашем частичном представлении:

<script type="text/javascript">
function partialScript() {
    alert("hi");
}
</script>

Это обеспечивает следующее:

  • загружается jQuery
  • Загружаются все сценарии основного вида.
  • DOM готов

Ответ 6

На всякий случай кто-то снова натыкается на это (и поскольку нет заметного ответа)... Вы не можете определить Javascript в частичном представлении, как указано в this Дарин.

Ответ 7

Единственный способ сделать это - вызвать действие контроллера с помощью JQuery и вернуть его частичное представление. Используйте JQuery для обновления любого раздела страницы, на котором выполняется частичный просмотр, а затем вызывают метод javascript, который вы хотите отобразить на карте.