Reputation: 5846
I am trying to pass an IList back to my View where it can be accessible in a jQuery .each(), but I'm not having any success.
Example class:
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;
}
}
}
In Controller:
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 ...
In the View I would like to use jQuery to iterate through ViewData["myNames"]:
<script type="text/javascript">
_myNames = '@ViewData["myNames"]';
$.each(_myNames, function (i, item) {
...
});
</script>
The above doesn't work and unfortunately I'm not sure how to debug it because the view is being called by EvoPDF PDF Generator.
I've also tried this in my View:
<input type="hidden" id="myNames" value="@ViewData["myNames"]" />
<script type="text/javascript">
_myNames = $('#myNames').val();
$.each(_myNames, function (i, item) {
});
</script>
Tracing through the controller code (where EvoPDF renders the page) I can see that the hidden field is containing the Type Name in the value attribute - not the data.
I've used ViewData many times without problem, but this is a bit different usage than I'm familiar with. Can anyone tell me how to pass an IList/List/IENumerable using ViewData so that I can iterate through it with jQuery .each()?
EDIT
As an alternative, I could make a jQuery call from within my razor, but I'm not sure how to pass the variable to 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>
}
But myName.Name
doesn't seem to being passed to the FormatName() function. I know for a fact that myName.Name contains a valid value because it renders fine without the jQuery. How do I pass that var to my jQuery function?
Upvotes: 0
Views: 28588
Reputation: 61
var UserName [email protected](Json.Encode(this.ViewData["UserName"]));
working fine
or
var UserName =JSON.parse('@Html.Raw(Json.Encode(this.ViewData["UserName"]))');
(less time consuming) or controller code:
this.ViewData["UserName"] = HttpUtility.HtmlEncode("somestring");
UI example:
var UserName ="Html.Raw(this.ViewData["UserName"])"
or JUST
var UserName ="Html.Raw(this.ViewData["UserName"])"
Upvotes: 2
Reputation:
You first need to convert TempData
property to a javascript array of objects. Oualid KTATA was on the right track with first suggestion, but that only returns a string. In you document ready function:
var _myNames = JSON.parse('@Html.Raw(Json.Encode(ViewData["myNames"]))');
which will return something like
[{ID:1, Name:"FirstName"}, {ID:2, Name:"SecondName"}, ...]
You can then access it with
$.each(_myNames, function(index, item) {
var id = item.ID;
var name = item.Name;
});
Upvotes: 3
Reputation: 1116
Try to use this when you set the viewData object to your client side variable:
var _myNames= @Html.Raw(Json.Encode(ViewData["myNames"]));
OR
_myNames = '<%= ViewData["myNames"] %>'
Instead of:
_myNames = '@ViewData["myNames"]';
Upvotes: 0