Подтвердить что ты не робот

Вызов javascript из действия контроллера MVC

Можно ли вызвать функцию javascript из действия контроллера MVC (а не со страницы просмотра) и получить возвращаемое значение? Как?


Мне нужно сделать запрос на сервер из кода (.cs), используя javascript, как здесь (, но это страница aspx)

function getInitData() { 
var code; code = 'return {' ;
code += 'me: API.getProfiles({uids: API.getVariable({key: 1280}), fields: "photo"})[0]'; 
code += '};'
VK.Api.call('execute', { 'code': code }, onGetInitData); 
} 
4b9b3361

Ответ 1

Вы можете вызвать действие контроллера из функции JavaScript, но не наоборот. Как сервер узнает, какой клиент будет нацелен? Сервер просто отвечает на запросы.

Пример вызова действия контроллера из JavaScript (с использованием библиотеки JavaScript jQuery) в ответе, отправленном клиенту.

$.ajax({
           type: "POST",
           url: "/Controller/Action", // the URL of the controller action method
           data: null, // optional data
           success: function(result) {
                // do something with result
           },                
           error : function(req, status, error) {
                // do something with error   
           }
       });

Ответ 2

Да, это определенно возможно с помощью Javascript Result:

return JavaScript("Callback()");

Javascript должен ссылаться на ваше мнение:

function Callback(){
    // do something where you can call an action method in controller to pass some data via AJAX() request
}

Ответ 3

Для тех, кто просто использовал стандартную форму submit (не-AJAX), есть еще один способ запустить некоторый код Javascript/JQuery после завершения вашего действия.

Сначала создайте свойство string в вашей модели.

public class MyModel 
{
    public string JavascriptToRun { get; set;}
}

Теперь привяжите свое новое свойство модели в Javascript вашего представления:

<script type="text/javascript">
     @Model.JavascriptToRun
</script>

Теперь, также в вашем представлении, создайте функцию Javascript, которая сделает все, что вам нужно:

<script type="text/javascript">
     @Model.JavascriptToRun

     function ShowErrorPopup() {
          alert('Sorry, we could not process your order.');
     }

</script>

Наконец, в действии вашего контроллера вам нужно вызвать эту новую функцию Javascript:

[HttpPost]
public ActionResult PurchaseCart(MyModel model)
{
    // Do something useful
    ...

    if (success == false)
    {
        model.JavascriptToRun= "ShowErrorPopup()";
        return View(model);
    }
    else
        return RedirectToAction("Success");
}

Ответ 4

Есть способы, которыми вы можете имитировать это, если ваш контроллер вернет часть данных, которую ваш взгляд может затем перевести на вызов JavaScript.

Мы делаем что-то подобное, чтобы люди могли использовать URL-адреса RESTful, чтобы поделиться просмотром рабочей области, созданной в jquery.

В нашем случае мы передаем список компонентов, которые нужно визуализировать, и используйте Razor для перевода этих данных в jquery-вызовы.

Ответ 5

Если я правильно понял вопрос, вы хотите иметь код JavaScript в своем контроллере. (Ваш вопрос достаточно ясен, но голосованные и принятые ответы бросают некоторые сомнения) Итак: вы можете сделать это с помощью элемента управления .NET System.Windows.Forms.WebBrowser для выполнения кода JavaScript и всего, что может сделать браузер. Это требует ссылки на System.Windows.Forms, хотя, и взаимодействие несколько "старой школы". Например:

void webBrowser1_DocumentCompleted(object sender, 
    WebBrowserDocumentCompletedEventArgs e)
{
    HtmlElement search = webBrowser1.Document.GetElementById("searchInput");
    if(search != null)
    {
        search.SetAttribute("value", "Superman");
        foreach(HtmlElement ele in search.Parent.Children)
        {
            if (ele.TagName.ToLower() == "input" && ele.Name.ToLower() == "go")
            {
                ele.InvokeMember("click");
                break;
            }
        }
    }
}

Так что, вероятно, в наше время это не было бы самым простым решением.

Другой вариант - использовать Javascript.NET или jint для запуска javasctipt или другого решения, основанного на конкретном случае.

Некоторые связанные вопросы по этой теме или возможные дубликаты:

Внедрение JavaScript-движка в .NET

Загрузите DOM и выполните javascript, сервер, с .Net

Надеюсь, что это поможет.

Ответ 6

Обычный/стандартный способ в MVC заключается в том, что вы должны помещать/вызывать все ваши отображения, пользовательский интерфейс, CSS и Javascript в представлении, однако для него нет правила, вы можете вызвать его и в контроллере if вам это удается (я не вижу возможности).

Ответ 7

Так как ваши действия контроллера выполняются на сервере, а JavaScript (обычно) выполняется на клиенте (браузере), это не имеет смысла. Если вам нужно выполнить какое-либо действие по умолчанию, как только страница будет загружена в браузер, вы можете использовать JavaScript document.OnLoad обработчик событий.

Ответ 8

<script>
    $(document).ready(function () {
        var msg = '@ViewBag.ErrorMessage'
        if (msg.length > 0)
            OnFailure('Register', msg);
    });

    function OnSuccess(header,Message) {
        $("#Message_Header").text(header);
        $("#Message_Text").text(Message);
        $('#MessageDialog').modal('show');
    }

    function OnFailure(header,error)
    {
        $("#Message_Header").text(header);
        $("#Message_Text").text(error);
        $('#MessageDialog').modal('show');
    }
</script>