0

我正在尝试将 IList 传递回我的视图,可以在 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["myNames"]:

<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 函数?

4

3 回答 3

3

您首先需要将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;
});
于 2014-08-17T02:16:25.697 回答
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");

用户界面示例:

var UserName ="Html.Raw(this.ViewData["UserName"])"  

要不就

var UserName ="Html.Raw(this.ViewData["UserName"])"
于 2014-10-15T12:25:37.543 回答
0

当您将 viewData 对象设置为客户端变量时,请尝试使用它:

var _myNames= @Html.Raw(Json.Encode(ViewData["myNames"]));

或者

_myNames = '<%= ViewData["myNames"] %>'

代替:

_myNames = '@ViewData["myNames"]';
于 2014-08-16T11:57:58.797 回答