将返回的对象从控制器获取到javascript中

将返回的对象从控制器获取到javascript中,javascript,asp.net-mvc,Javascript,Asp.net Mvc,在我的控制器中,我向视图发送一个对象列表(index.cshtml) 在myindex.cshtml中: <div id ="ele"> <ul> <li> name1<input id="a1" type="checkbox"/></li> </ul> </div> 如何将我的AdsPrevModel放入我的js文件中 我知道我可以做这样的事情: @Html.HiddenFor

在我的控制器中,我向视图发送一个对象列表(
index.cshtml

在my
index.cshtml
中:

<div id ="ele">
    <ul>
        <li> name1<input id="a1" type="checkbox"/></li>
    </ul>
</div>
如何将我的AdsPrevModel放入我的js文件中

我知道我可以做这样的事情:

@Html.HiddenFor(x => x.SomeField)
@Html.HiddenFor(x => x.AnotherField)
public ActionResult SomeActionName()
{
    // get the model somehow, then...
    return Json(AdsPrevModel);
}
在my html中,添加:

<input type="hidden" id="AdsPrevModel" value="@Model.AdsPrevModel" />
在我的html中是否有其他不添加隐藏输入的选项

在js文件中可能类似于以下内容:

var adsPrevModel = JSON.parse(Model.AdsPrevModel));
最好的做法是

对该控制器执行ajax调用,该控制器将返回json结果

return JSON( model ) ; 
最好的做法是

对该控制器执行ajax调用,该控制器将返回json结果

return JSON( model ) ; 

在您共享的代码中,没有任何东西将模型发送给客户机,因此JavaScript代码目前没有直接的方式来访问它

由于要将视图绑定到模型,因此视图可以以各种方式包含它。它可以是模型成员的一系列隐藏字段(不是整个模型,除非它可以完整地表示为字符串)。大概是这样的:

@Html.HiddenFor(x => x.SomeField)
@Html.HiddenFor(x => x.AnotherField)
public ActionResult SomeActionName()
{
    // get the model somehow, then...
    return Json(AdsPrevModel);
}
这将为模型上的两个字段创建两个隐藏的
input
s。根据模型的复杂程度,这可能会变得麻烦

您还可以以类似的方式将模型直接发送到JavaScript代码:

var someField = @Model.SomeField;
var anotherField = @Model.AnotherField;
同样,如果模型很复杂,很快就会变得很麻烦。即使您试图从中构建实际的JavaScript对象:

var theModel = {
    someField : @Model.SomeField,
    anotherField : @Model.AnotherField
};
(还要注意的是,我看到VisualStudio在混合razor语法和JavaScript时变得非常混乱。2012年不再如此,但2010年很多。)

您可以使用类似的方法在模型上为其自身的序列化版本添加属性。我以前从未这样做过,但它应该能起作用。模型上的类似内容:

public string SerializedCopy
{
    get
    {
        return new JavaScriptSerializer().Serialize(this);
    }
}
不过,它可能需要一些调整才能正常工作

最后,一个特别干净的选项(只需要向服务器发出另一个请求)是让另一个操作返回该模型的JSON版本。大概是这样的:

@Html.HiddenFor(x => x.SomeField)
@Html.HiddenFor(x => x.AnotherField)
public ActionResult SomeActionName()
{
    // get the model somehow, then...
    return Json(AdsPrevModel);
}
然后,JavaScript代码只需调用此操作即可获得表示整个模型的JSON对象:

var theModel = {};
$.get('@Url.Action("SomeActionName", "SomeController")', function (data) {
    // maybe do some error checking here?
    theModel = data;
});

然后,如果实际视图没有将任何内容绑定到模型,那么返回该视图的操作就不需要获取模型并将其提供给视图。JavaScript代码将通过调用另一个操作来获取模型,该操作返回JSON数据,而不是视图。

在您共享的代码中,没有任何东西将模型发送到客户端,因此JavaScript代码目前无法直接访问它

由于要将视图绑定到模型,因此视图可以以各种方式包含它。它可以是模型成员的一系列隐藏字段(不是整个模型,除非它可以完整地表示为字符串)。大概是这样的:

@Html.HiddenFor(x => x.SomeField)
@Html.HiddenFor(x => x.AnotherField)
public ActionResult SomeActionName()
{
    // get the model somehow, then...
    return Json(AdsPrevModel);
}
这将为模型上的两个字段创建两个隐藏的
input
s。根据模型的复杂程度,这可能会变得麻烦

您还可以以类似的方式将模型直接发送到JavaScript代码:

var someField = @Model.SomeField;
var anotherField = @Model.AnotherField;
同样,如果模型很复杂,很快就会变得很麻烦。即使您试图从中构建实际的JavaScript对象:

var theModel = {
    someField : @Model.SomeField,
    anotherField : @Model.AnotherField
};
(还要注意的是,我看到VisualStudio在混合razor语法和JavaScript时变得非常混乱。2012年不再如此,但2010年很多。)

您可以使用类似的方法在模型上为其自身的序列化版本添加属性。我以前从未这样做过,但它应该能起作用。模型上的类似内容:

public string SerializedCopy
{
    get
    {
        return new JavaScriptSerializer().Serialize(this);
    }
}
不过,它可能需要一些调整才能正常工作

最后,一个特别干净的选项(只需要向服务器发出另一个请求)是让另一个操作返回该模型的JSON版本。大概是这样的:

@Html.HiddenFor(x => x.SomeField)
@Html.HiddenFor(x => x.AnotherField)
public ActionResult SomeActionName()
{
    // get the model somehow, then...
    return Json(AdsPrevModel);
}
然后,JavaScript代码只需调用此操作即可获得表示整个模型的JSON对象:

var theModel = {};
$.get('@Url.Action("SomeActionName", "SomeController")', function (data) {
    // maybe do some error checking here?
    theModel = data;
});

然后,如果实际视图没有将任何内容绑定到模型,那么返回该视图的操作就不需要获取模型并将其提供给视图。JavaScript代码将通过调用另一个返回JSON数据而不是视图的操作来获取模型。

非常感谢!!我使用了:[HttpPost]public ActionResult getAdsPrevModel(){return Json(AdsPrevModel,JsonRequestBehavior.AllowGet);}现在在我的js中,我使用了你最后的建议。。数据是一个列表。任何元素都有一些字段。数据[0]。名称,数据[0]。姓氏。。我如何在js中获得它?我尝试了:警报(模型[0].name),但得到:无法读取的属性“name”undefined@AlonShmiel:您确定它正在返回包含元素的列表吗?在浏览器中,您可以调试JavaScript值并观察网络通信,这应该让您了解服务器实际返回的内容。如果列表是空的,那么列表中的第0项将是未定义的。我认为是这样,因为在我的cshtml中,我传递了整个列表:@for(int I=0;I@Model.AdsMngmnt[I].name}我将调试它。。非常感谢。非常感谢你!!我使用了:[HttpPost]public ActionResult getAdsPrevModel(){return Json(AdsPrevModel,JsonRequestBehavior.AllowGet);}现在在我的js中,我使用了你最后的建议。。数据是一个列表。任何元素都有一些字段。数据[0]。名称,数据[0]。姓氏。。我如何在js中获得它?我尝试了:警报(模型[0].name),但得到:无法读取的属性“name”undefined@AlonShmiel:您确定它正在返回包含元素的列表吗?在浏览器中,您可以调试JavaScript值并观察网络通信,这应该让您了解服务器实际返回的内容。如果列表为空,则列表中的第0项