我是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]注释动作方法?
答案 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;