Asp.net MVC передачи объекта C # в Javascript - PullRequest
18 голосов
/ 16 ноября 2011

У меня есть класс c #, скажем, параметры больше похожи на 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();

}

Теперь в моем действии контроллера

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


 }

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

@model options

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

</script>

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

Спасибо

Ответы [ 6 ]

29 голосов
/ 16 ноября 2011

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

@model options

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

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

РЕДАКТИРОВАТЬ - Что может вас заинтересовать, так это то, что если ваш 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);
    }
 }

И, наконец,view:

@model optionsViewModel

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

</script>

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

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

EDIT 3 Возможно, самый простой способ?Те же предпосылки, что и в редактировании 2, однако здесь используется вид для JsonEncode модели.Вероятно, есть несколько хороших аргументов с обеих сторон, следует ли это делать на уровне представления, контроллера или хранилища / службы.Тем не менее, для выполнения преобразования в представлении ...

@model options

<script>
   dosomething('@Html.Raw(Json.Encode(Model))');
</script>
8 голосов
/ 05 января 2017

Попробуйте это:

<script type="text/javascript">
    var obj= @Html.Raw(Json.Encode(Model));
    function dosomething(obj){}
</script>
2 голосов
/ 19 апреля 2016

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

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

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>
1 голос
/ 16 ноября 2011

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

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

В итоге ты ...

Клиент Javascript:

var chat = $.connection.chat;
chat.name = prompt("What's 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 в C # в конечном итоге вызывает функцию chat.receive в javascript.

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

1 голос
/ 16 ноября 2011

есть также синтаксическая ошибка

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

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

<script type="text/javascript">
  dosomething("this model has been stringified!");
</script>
0 голосов
/ 16 ноября 2011

Вы можете использовать JavaScriptSerializer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...