Asp.net mvc将C#对象传递给Javascript

Par*_*der 20 javascript asp.net-mvc object

我有c#class say更像AjaxOptions的选项.

public class options
{
   public string Url {get;set;}
   public string httpMethod {get;set}
}
Run Code Online (Sandbox Code Playgroud)

和这样的javascript函数

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

}
Run Code Online (Sandbox Code Playgroud)

现在在我的Controller动作中

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


 }
Run Code Online (Sandbox Code Playgroud)

在我看来,我需要这个对象类型的字符串,我应该能够传递给我的方法.

@model options

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

</script>
Run Code Online (Sandbox Code Playgroud)

所以我需要这个SomeFunctionToConverToString方法,我将这个对象转换为字符串.

谢谢

Tom*_*mmy 31

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

@model options

<script>
   dosomething('@(model.Url)');
</script>
Run Code Online (Sandbox Code Playgroud)

有关在JS中使用Razor的更多信息,请参阅此文章

编辑 - 可能会让你感到困惑的是,如果你的URL被Razor使用上面的HTML编码所破坏,你可以使用@Html.Raw()将传递Url属性而不用HTML编码的函数.

<script>
   dosomething('@Html.Raw(model.Url)');
</script>
Run Code Online (Sandbox Code Playgroud)

编辑2 - 另一个SO帖子救援!您最有可能希望将模型转换为JSON以便在Javascript函数中使用.所以...为了做到这一点 - 你需要在视图模型中处理一个JSON对象.

public class optionsViewModel
{
   public options Options{get;set;}
   public string JsonData{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

并在您的控制器中:

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);
    }
 }
Run Code Online (Sandbox Code Playgroud)

最后是观点:

@model optionsViewModel

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

</script>
Run Code Online (Sandbox Code Playgroud)

使用此方法,您的函数将按预期工作:

function dosomething(obj)
{
   if (obj.Url!="" and obj.HttpMethod=="something")
    loadsomething();
}
Run Code Online (Sandbox Code Playgroud)

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

@model options

<script>
   dosomething('@Html.Raw(Json.Encode(Model))');
</script>
Run Code Online (Sandbox Code Playgroud)


san*_*ewa 9

试试这个:

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

  • 最好在代码中包含一些上下文/解释,因为这使得答案对 OP 和未来的读者更有用。 (3认同)