在jQuery中访问ViewData无法正常工作

时间:2014-08-16 08:23:44

标签: jquery asp.net-mvc evopdf

我正在尝试将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函数?

3 个答案:

答案 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"]';