当从javascript调用动作时,Asp.net MVC控制器参数为null

时间:2015-04-16 00:42:00

标签: c# asp.net asp.net-mvc

我是MVC的新手,并试图通过js导航到控制器动作方法。代码有效(如在action方法中命中),但我传入的参数值始终为null

JS:

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

控制器操作:

public class ReportsController : Controller    {

     public ActionResult Step1(int? rsid)
        {

          //do stuff
        }
}

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

我是否需要自定义路线来获取参数?

或者可以用[httpPost]或[httpGet]注释动作方法?

5 个答案:

答案 0 :(得分:2)

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

为了使此故障安全,您还需要确保您的URL可以安全地存储在JavaScript字符串中,方法是将其包装在HttpUtility.JavaScriptStringEncode的调用中,然后通过包装而不使用HTML编码进行呈现在Html.Raw

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}));

答案 1 :(得分:2)

您可能映射到默认路由:/ controller / action / id。现在,在您的操作声明中,您将参数命名为rsid,它不会映射到id,因为名称不同。将您的操作签名更改为:

public ActionResult Step1(int? id)

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

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

答案 2 :(得分:1)

最简单的方法是将参数命名为“id”,因为它在默认路由中并从js调用,如下所示:

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

public ActionResult Step1(int? id)
{

          //do stuff
}

答案 3 :(得分:0)

这会创建什么网址?

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

这样的事情:

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

该网址中没有名为rsid的参数,因此模型绑定器不知道在哪里找到该值。您需要为值赋予密钥:

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

这会产生更像这样的东西:

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

答案 4 :(得分:0)

尝试后有一个rsid?所以该值将映射到rsid

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