【问题标题】:Asp.net mvc passing a C# object to JavascriptAsp.net mvc 将 C# 对象传递给 Javascript
【发布时间】:2011-12-30 01:12:39
【问题描述】:

我有 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 方法,我会将这个对象转换为字符串。

谢谢

【问题讨论】:

  • 您是否要让模型及其属性可用于 javascript?或者您是否尝试使模型中的单个字符串属性可用于您的脚本?

标签: javascript asp.net-mvc object


【解决方案1】:

您应该能够像使用视图中模型属性的任何其他输出一样使用它。只需在 JS 函数中引用您要传递的属性即可。

@model options

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

有关在 JS 中使用 Razor 的更多信息,请参阅 this post

EDIT - 如果你的 URL 被 Razor 使用上述代码所使用的 HTML 编码破坏了,你可以使用 @Html.Raw() 函数来传递 Url 属性,这可能会引起你的注意。 HTML 编码。

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

EDIT 2 - 还有another SO post 来救援!您很可能希望将模型转换为 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();
}

EDIT 3 可能是最简单的方法了吗?与编辑 2 相同的前提,但是这是使用视图对模型进行 JsonEncode。无论这是否应该在视图、控制器或存储库/服务层中完成,双方都可能有一些很好的论据。但是,对于在视图中进行转换...

@model options

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

【讨论】:

  • 我需要传递整个对象,传递属性根本不是问题。
  • 我并不是要发布最后一条评论,我打算在我记得我无法在此处格式化代码后创建一个新答案。
  • Tommy,你没有明白这一点,剃刀语法不是问题。问题是如何将对象转换为字符串。
  • @Parminder - 在你更新你的问题之前我明白了:) 寻找另一个编辑
  • Tommy,我需要转换整个对象,而不仅仅是一个属性。
【解决方案2】:

试试这个:

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

【讨论】:

  • 最好在代码中包含一些上下文/解释,因为这会使答案对 OP 和未来的读者更有用。
  • @PrakharTrivedi 仅代码的答案可能不是一个好的答案,但它仍然是一个答案。我会向你推荐这篇关于 LQPRQ 的帖子:You're doing it wrong: A plea for sanity in the Low Quality Posts queue
  • 它对我有用,我学到的是:Json.Encode 会将数据对象转换为 JavaScript 对象表示法 (JSON) 格式的字符串。而 Html.Raw 只会给你一个不是 Html 编码的标记
  • 在上面的例子中“var obj= @Html.Raw(Json.Encode(Model));” obj 将包含类似于 C# 对象的对象,您可以使用它我使用它并获取它(我使用它的地方)screencast.com/t/TiJxKVK06Xo
  • 虽然不直观,但在这里使用 JSON.parse 会更快。例如,var obj= JSON.parse('@Html.Raw(Json.Encode(Model))');
【解决方案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>
    

    【讨论】:

    • 我的错误,但 stringify 不是你在这里看到的 msdn.microsoft.com/en-us/library/cc836459%28VS.85%29.aspx ,我已经编辑了这个问题。看看吧。
    • 在模型上调用什么函数并不重要。关键是模型在服务器上执行,而 javascript 在客户端上执行。一切都源于对代码执行位置的理解。
    【解决方案5】:

    我建议你看看SignalR,它允许服务器触发的 javascript 回调。

    查看 Scott H 网站了解详情: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);
        }
    }
    

    所以 .. C# 中的 Clients.receive 最终会触发 javascript 中的 chat.receive 函数。

    它也可以通过 NuGet 获得。

    【讨论】:

    • 当你试图从别人那里得到答案时,你的态度肯定很直率。您的标题声明您正在寻找将 C# 对象传递给 html 视图,SignalR 执行此操作。 SignalR 是实现您所要求的另一种方式,并且提供比包含完整 http 标头的多次发送更低的带宽消耗。
    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2013-09-22
    • 2022-01-16
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多