views:

354

answers:

5

I'm trying to redirect to another page by calling an action in controller with a specific parameter. I'm trying to use this line:

window.open('<%= Url.Action("Report", "Survey", new { id = ' + selectedRow + ' } ) %>');

But I couldn't make it work; it gives the following error:

CS1012: Too many characters in character literal.

Can't I generate the action URL this was on the client side? Or do I have to make an Ajax call by supplying the parameter and get back the needed URL? This doesn't seem right, but I want to if it's the only way.

Is there an easier solution?

A: 

Could you do

window.open('/report/survey/' + selectedRow);

instead where selected row I assume is the id? The routing should pick this up fine.

or use getJSON

Perhaps you could use JSONResult instead. Wherever the window.open should be call a method instead i.e. OpenSurveyWindow(id);

then add some jquery similar to below

    function OpenSurveyWindow(id){
          $.getJSON("/report/survey/" + id, null, function(data) {
              window.open(data);
         });
    }

now in your controller

public JsonResult Survey(int id)
{
    return Json(GetMyUrlMethod(id));
}

That code isnt syntactically perfect but something along those lines should work

Israfel
But I want the url to be generated by the Url.Action because this way I also have the specify the url root parameters which can change!
canxss
Thanks for the reply. It works but in order get a simple route making an ajax call doesn't seem OK to me. But if there wasn't any other way I would do it anyway.
canxss
A: 

You wont be able to do this, the URL.Action is a server side process so will parse before the clientside selectedRow is available. Israfel has the answer I would suggest.

Pharabus
A: 

Hey,

If selectedRow is a client-side variable, it won't work. You have to use @Israfel implementation to link. This is because the server-side runs before the client-side variable even exists.

If selectedRow is a server-side variable within the view, change to this:

window.open('<%= Url.Action("Report", "Survey", new { id = selectedRow } ) %>');

This is because the id will infer the selectedRow variable type, or you could convert to string with ToString() method (as long as it's not null).

Brian
+2  A: 

Remember that everything between <% and %> is interpreted as C# code, so what you're actually doing is trying to evaluate the following line of C#:

Url.Action("Report", "Survey", new { id = ' + selectedRow + ' } )

C# thinks the single-quotes are surrounding a character literal, hence the error message you're getting (character literals can only contain a single character in C#)

Perhaps you could generate the URL once in your page script - somewhere in your page HEAD, do this:

 var actionUrl = '<%= Url.Action("Report", "Survey", new { id = "PLACEHOLDER" } ) %>';

That'll give you a Javascript string containing the URL you need, but with PLACEHOLDER instead of the number. Then set up your click handlers as:

window.open(actionUrl.replace('PLACEHOLDER', selectedRow));

i.e. when the handler runs, you find the PLACEHOLDER value in your pre-calculated URL, and replace it with the selected row.

Dylan Beattie
Thanks for the answer. It worked!
canxss
A: 

I usually declare a javascript variable in the section to hold the root of my website.

<%="<script type=\"text/javascript\">var rootPath = '" + Url.Content("~/") + "';</script>" %>

To solve your problem I would simply do

window.open(rootPath + "report/survey/" + selectedRow);
Jaco Pretorius