Asp.net mvc передает объект С# в Javascript

У меня есть класс С#, который говорит, что параметры больше похожи на AjaxOptions.

public class options
{
   public string Url {get;set;}
   public string httpMethod {get;set}
}

и функция javascript, подобная этой

function dosomething(obj)
{
   if (obj.Url!="" and obj.HttpMethod=="something")
    loadsomething();

}

Теперь в моем действии Controller

 public class mycontroller : controller
 {
    public ActionResult WhatToDo()
    {
       options obj = new options{Url="someurl"};
       return PartialView(obj);
    }


 }

В моем представлении мне нужен этот объект типа строки, который я должен был бы передать моему методу.

@model options

<script>
   dosomething(@model.SomeFunctionToConverToString())

</script>

Мне нужен этот метод SomeFunctionToConverToString, который я преобразую в объект.

Спасибо

Ответ 1

Вы должны иметь возможность использовать его, как и любой другой вывод свойства модели в своем представлении. Просто укажите свойство, которое вы хотите передать в функции JS.

@model options

<script>
   dosomething('@(model.Url)');
</script>

См. этот пост для получения дополнительной информации об использовании Razor внутри JS

EDIT. Что-то, что может вас поймать, это то, что если ваш URL-адрес будет разорван из кодировки HTML, которую использует Razor, используя функцию выше, вы можете использовать функцию @Html.Raw(), которая будет передавать свойство Url без HTML кодирует его.

<script>
   dosomething('@Html.Raw(model.Url)');
</script>

РЕДАКТИРОВАТЬ 2 - и другое сообщение SO на помощь! Скорее всего, вы захотите преобразовать свою модель в JSON, чтобы использовать ее в функции Javascript. Итак... чтобы это сделать - вам понадобится что-то в вашей модели просмотра для обработки объекта JSON.

public class optionsViewModel
{
   public options Options{get;set;}
   public string JsonData{get;set;}
}

и в вашем контроллере:

public class mycontroller : controller
 {
    public ActionResult WhatToDo()
    {
       options obj = new options{Url="someurl"};
       var myViewModel = new optionsViewModel;
       myViewModel.options = obj;
       var serializer = new JavaScriptSerializer();
       myViewModel.JsonData = serializer.Serialize(data);
       return PartialView(myViewModel);
    }
 }

И, наконец, представление:

@model optionsViewModel

<script>
   dosomething('@model.JsonData')

</script>

Используя этот метод, ваша функция будет работать как ожидалось:

function dosomething(obj)
{
   if (obj.Url!="" and obj.HttpMethod=="something")
    loadsomething();
}

РЕДАКТИРОВАТЬ 3 Потенциально самый простой способ? Такая же предпосылка, как и в редакторе 2, однако это использует модель View to JsonEncode. Вероятно, есть некоторые хорошие аргументы с обеих сторон, следует ли это делать на уровне представления, контроллера или хранилища/службы. Однако для выполнения преобразования в представлении...

@model options

<script>
   dosomething('@Html.Raw(Json.Encode(Model))');
</script>

Ответ 2

Попробуйте следующее:

<script type="text/javascript">
    var obj= @Html.Raw(Json.Encode(Model));
    function dosomething(obj){}
</script>

Ответ 3

Это работает для меня

Клиентская сторона:

function GoWild(jsonData)
{
    alert(jsonData);
}

Печать предупреждений:

{"wildDetails":{"Name":"Al","Id":1}}

Сторона бритвы MVC:

 @{var serializer new System.Web.Script.Serialization.JavaScriptSerializer();}
<div onclick="GoWild('@serializer.Serialize(Model.wildDetails)')"> Serialize It </div>

Ответ 4

существует также синтаксическая ошибка

<script type="text/javascript">
  dosomething("@Model.Stringify()");
</script>

Обратите внимание на цитаты вокруг @Model.Stringify() для javascript, поэтому испущенный HTML будет:

<script type="text/javascript">
  dosomething("this model has been stringified!");
</script>

Ответ 5

Я бы порекомендовал вам взглянуть на SignalR, он позволяет запускать обратные вызовы javascript, вызванные сервером.

Подробнее см. сайт Скотта Х: http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx

В заключение вы...

Клиент Javascript:

var chat = $.connection.chat;
chat.name = prompt("What your name?", "");

chat.receive = function(name, message){
    $("#messages").append("
"+name+": "+message);
}

$("#send-button").click(function(){
    chat.distribute($("#text-input").val());
});

Сервер:

public class Chat : Hub {
    public void Distribute(string message) {
        Clients.receive(Caller.name, message);
    }
}

Итак, Clients.receive в С# завершает запуск функции chat.receive в javascript.

Он также доступен через NuGet.