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.
Ответ 6
Вы можете использовать JavaScriptSerializer
.