我正在尝试将IList传递回我的View,它可以在jQuery .each()中访问,但我没有取得任何成功。
示例类:
public class MyClass
{
private string _Name = "";
public int Id = null;
public MyClass ( string Name, int Id = null )
{
... Do something ...
}
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
}
}
在控制器中:
IList<MyClass> myClass = null;
myClass = GetNames();
ViewDataDictionary viewData = new ViewDataDictionary(null);
viewData.Add("myNames", Json(myClass));
// The string writer where to render the HTML code of the view
StringWriter stringWriter = new StringWriter();
// Render the Index view in a HTML string
ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext,
"GeneratePDF", null);
ViewContext viewContext = new ViewContext(
ControllerContext,
viewResult.View,
viewData,
new TempDataDictionary(),
stringWriter
);
viewResult.View.Render(viewContext, stringWriter);
... Omitted for brevity ...
在视图中我想使用jQuery迭代ViewData [&#34; myNames&#34;]:
<script type="text/javascript">
_myNames = '@ViewData["myNames"]';
$.each(_myNames, function (i, item) {
...
});
</script>
以上不起作用,遗憾的是我不确定如何调试它,因为EvoPDF PDF Generator正在调用该视图。
我也在我的观点中试过这个:
<input type="hidden" id="myNames" value="@ViewData["myNames"]" />
<script type="text/javascript">
_myNames = $('#myNames').val();
$.each(_myNames, function (i, item) {
});
</script>
跟踪控制器代码(EvoPDF渲染页面的地方)我可以看到隐藏字段包含值属性中的类型名称 - 而不是数据。
我已多次使用ViewData而没有任何问题,但这与我熟悉的用法略有不同。任何人都可以告诉我如何使用ViewData传递IList / List / IENumerable,以便我可以使用jQuery .each()迭代它吗?
修改
作为替代方案,我可以在剃刀内进行jQuery调用,但我不确定如何将变量传递给jQuery:
@foreach (var myName in (List<MyClass>)ViewData["myNames"])
{
<tr>
<td class="text-center">
<script type="text/javascript">
FormatName('@myName.Name', 1);
</script>
</td>
</tr>
}
但是myName.Name
似乎没有传递给FormatName()函数。我知道myName.Name包含一个有效值,因为它在没有jQuery的情况下渲染得很好。如何将该var传递给我的jQuery函数?
答案 0 :(得分:2)
首先需要将TempData
属性转换为javascript对象数组。 Oualid KTATA在第一个建议的情况下走在正确的轨道上,但只返回一个字符串。在你的文件就绪功能:
var _myNames = JSON.parse('@Html.Raw(Json.Encode(ViewData["myNames"]))');
将返回类似
的内容[{ID:1, Name:"FirstName"}, {ID:2, Name:"SecondName"}, ...]
然后您可以使用
访问它$.each(_myNames, function(index, item) {
var id = item.ID;
var name = item.Name;
});
答案 1 :(得分:1)
var UserName =@Html.Raw(Json.Encode(this.ViewData["UserName"]));
工作正常
或
var UserName =JSON.parse('@Html.Raw(Json.Encode(this.ViewData["UserName"]))');
(耗时少) 要么 控制器代码:
this.ViewData["UserName"] = HttpUtility.HtmlEncode("somestring");
UI示例:
var UserName ="Html.Raw(this.ViewData["UserName"])"
或 JUST
var UserName ="Html.Raw(this.ViewData["UserName"])"
答案 2 :(得分:0)
将viewData对象设置为客户端变量时,请尝试使用此选项:
var _myNames= @Html.Raw(Json.Encode(ViewData["myNames"]));
OR
_myNames = '<%= ViewData["myNames"] %>'
而不是:
_myNames = '@ViewData["myNames"]';