2015-04-16 120 views
2

我是MVC的新手,并试图通过js导航到控制器动作方法。代码工作(如action方法被击中),但参数值,我传递的总是空Asp.net MVC控制器参数null当从javascript调用动作时

JS:

window.location.href = "@Url.Action("Step1", "Reports")" + "/?" + rsid; 

控制器动作:

public class ReportsController : Controller { 

    public ActionResult Step1(int? rsid) 
     { 

      //do stuff 
     } 
} 

的RSID参数始终为空。我尝试了各种链接格式,例如“/?rsid = [id]”,“/ [id]”

我是否需要一个自定义路由来获取参数?

或者可能用[httpPost]或[httpGet]注释操作方法?

+0

你试过了吗?“@ Url.Action(”Step1“,”Reports“)”+“/?rsid =”+ rsid'? – Neverever

+1

您没有为参数'rsid'提供任何值(所以它'null') –

+2

此外,[下载fiddler](http://www.telerik.com/fiddler)。它很有帮助,看看发送了哪些参数,并且更容易识别问题 – TheUknown

回答

1

做到这一点最简单的方法是只命名参数“ID”,因为它是在默认路由和JS调用是这样的:

'@Html.ActionLink("Step1", "Reports", new { id = ' + rsid + ' })' 

public ActionResult Step1(int? id) 
{ 

      //do stuff 
} 
2

无需字符串连接。正如你发现的那样,它很容易出错。只需使用路由值(使用a different overload of UrlHelper.Action)提供一个匿名对象,然后让MVC路由决定如何表示它。

为了使这个万无一失,您还需要确保您的网址是安全由以HttpUtility.JavaScriptStringEncode一个电话,然后在不HTML编码通过Html.Raw包装渲染它包裹在一个JavaScript字符串存储:

window.location.href = 
"@Html.Raw(HttpUtility.JavaScriptStringEncode(Url.Action("Step1", "Reports", new{rsid})))"; 

您可以简化与助手扩展方法事项(上的HtmlHelper扩展方便似乎对我来说)

public static class JavascriptHelperEx 
{ 
    public static IHtmlString QuotedJsString(this HtmlHelper htmlHelper, string str) 
    { 
     //true parameter below wraps everything in double quotes: 
     return htmlHelper.Raw(HttpUtility.JavaScriptStringEncode(str, true)); 
    } 
} 

所以现在:

window.location.href = @Html.QuotedJsString(Url.Action("Step1", "Reports", new{rsid})); 
+0

@AlexeiLevenkov:我认为以上是你的意思... – spender

+1

是的,还需要'@ Html.Raw(...'as'@ @ ''会HtmlEncode的URL。'location.href' *可能*处理这种过度编码的网址,但在JavaScript中的常规URL操作可能会完全混淆(不直接适用于OP的情况下)... –

+0

哎呀!真是一团糟! – spender

0

这会创建什么URL?

"@Url.Action("Step1", "Reports")" + "/?" + rsid; 

事情是这样的:

http://server/controller/action/?123 

有在URL称为rsid没有参数,所以模型绑定不知道在哪里可以找到该值。你需要给的价值的关键:

"@Url.Action("Step1", "Reports")" + "/?rsid=" + rsid; 

这更是这样创造的东西:

http://server/controller/action/?rsid=123 
+0

感谢David,我想我发现了这个问题,如果我将我的控制器参数重命名为id,并删除它工作的url中的问号,因为它符合默认路由模式。那么这是否意味着如果我想在控制器操作中使用有意义的参数名称(而不仅仅是id),那么我需要为每个参数模式设置一个自定义路由掩码? (或者只是从查询字符串老派提取参数值) – Programnik

2

你可能映射到这是一个缺省路由/控制器/动作/ ID。现在在你的action声明中,你将你的参数命名为rsid,它不会映射到id,因为name是不同的。改变你的行动签名:

public ActionResult Step1(int? id) 

或选项b)是从指定的js侧的参数的名称:

window.location.href = "@Url.Action("Step1", "Reports")" + "/?rsid=" + rsid; 
0

尝试有后的,RSID?所以这个值将映射到rsid

相关问题