Javascript MVC将数据从视图发送到控制器

Javascript MVC将数据从视图发送到控制器,javascript,asp.net-mvc,Javascript,Asp.net Mvc,我开始学习asp.NETMVC,这可能是一个愚蠢的问题,但我似乎不知道我做错了什么 我有一个返回数据的控制器,其中一些变量存储在ViewBag中。使用ViewBag中存储的变量,我创建了一个表(它们存储行数和列数) 视图有一个按钮,当用户单击它时,我想用不同的维度重新创建表 function OnClick_prev() { @Html.ActionLink("Index", "Index", new {id = ViewBag.width+5}) } 我遇到的问题是,

我开始学习asp.NETMVC,这可能是一个愚蠢的问题,但我似乎不知道我做错了什么

我有一个返回数据的控制器,其中一些变量存储在ViewBag中。使用ViewBag中存储的变量,我创建了一个表(它们存储行数和列数)

视图有一个按钮,当用户单击它时,我想用不同的维度重新创建表

    function OnClick_prev() {
    @Html.ActionLink("Index", "Index", new {id = ViewBag.width+5})
    }
我遇到的问题是,JavaScript函数体抛出了一个错误(在firebug中可以看到),但不确定原因。错误是SyntaxError:语法错误Index


有什么提示吗?

问题在于
ViewBag的基本类型是,
ExpandoObject
实际上是
Dictionary
,因此
ViewBag.width+5
相当于

object + int
不会编译的。在执行计算之前,您需要将
width
属性强制转换为
int

{ id = ((int)ViewBag.width + 5) }

问题在于
ViewBag的基本类型是,
ExpandoObject
实际上是
Dictionary
,因此
ViewBag.width+5
相当于

object + int
不会编译的。在执行计算之前,您需要将
width
属性强制转换为
int

{ id = ((int)ViewBag.width + 5) }

改变你的JS如下

function OnClick_prev() {
    var loc = '@Url.Action("Index", "Index", new {id = (int)ViewBag.width+5})';
    window.location = loc;
}

改变你的JS如下

function OnClick_prev() {
    var loc = '@Url.Action("Index", "Index", new {id = (int)ViewBag.width+5})';
    window.location = loc;
}

编辑:刚刚意识到我的初始答案不起作用,因为你在使用POST

将GET方法更改为此

[HttpGet]
public ActionResult Index(int id)
{
    // Do some check on id to see if it has a value then add your old POST code here
    ViewBag.widht = someNumber1;
    ViewBag.height = someNumber2;
    return View(someData);
}
MVC有默认的路由

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
因此,您不必将id作为可选项传递给该方法

然后在您的视图中,将代码更改为

@Html.ActionLink("Index", "Index", new {id= (int)ViewBag.width+5})

编辑:刚刚意识到我的初始答案不起作用,因为你在使用POST

将GET方法更改为此

[HttpGet]
public ActionResult Index(int id)
{
    // Do some check on id to see if it has a value then add your old POST code here
    ViewBag.widht = someNumber1;
    ViewBag.height = someNumber2;
    return View(someData);
}
MVC有默认的路由

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
因此,您不必将id作为可选项传递给该方法

然后在您的视图中,将代码更改为

@Html.ActionLink("Index", "Index", new {id= (int)ViewBag.width+5})

尝试将链接包装在此函数中的
。能否向我们展示您使用的JS?我们可以看到href的整个HTML吗?有结束吗?你想完成什么
Html.ActionLink
只是在页面上呈现
标记,它不会生成任何Javascript。请尝试将链接包装在该函数中的
。您可以向我们展示您使用的JS吗?我们可以看到href的整个HTML吗?有结束吗?你想完成什么
Html.ActionLink
只是在页面上呈现
标记,它不会生成任何JavaScripts。这绝对没有什么区别。您尝试过这个吗?这将重定向到特定操作,但您生成的操作链接(即锚定标记)是错误的。但这是您要求的。我没有尝试过,但问题仍然是,
ViewBag.width+5
将无法编译。请先尝试,然后报告评论。这对我有用。你得到结果了吗?这绝对没有什么区别。你试过这个吗?这将重定向到特定操作,但您生成的操作链接(即锚定标记)是错误的。但这是您要求的。我没有尝试过,但问题仍然是,
ViewBag.width+5
将无法编译。请先尝试,然后报告评论。这对我有用,你得到结果了吗