MVC将数据从View发送到Controller

时间:2015-01-06 09:14:04

标签: javascript asp.net-mvc

我开始学习asp.net MVC,可能这是一个愚蠢的问题,但我似乎无法弄清楚我做错了什么。

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

    [HttpGet]
    public ActionResult Index()
    {
        ViewBag.widht = someNumber1;
        ViewBag.height = someNumber2;
        return View(someData);
    }

   [HttpPost]
    public ActionResult Index(int someNuber)
    {
        //calculate the new width and height using someNumber
        ViewBag.widht = newWidth;
        ViewBag.height = newHeight;
        return PartialView();
    }

View有一个按钮,当用户点击它时,我想重新创建具有不同尺寸的表。

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

我遇到的问题是,JavaScript函数的主体会抛出一个错误(在firebug中看到),并不确定原因。错误是SyntaxError:语法错误< a href =" / Home / Index / 36">索引

任何提示?

3 个答案:

答案 0 :(得分:3)

如下所示更改您的JS

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

答案 1 :(得分:1)

问题是ViewBag的基础类型是ExpandoObjectExpandoObject实际上是Dictionary<string, object>,因此ViewBag.width+5相当于

object + int

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

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

答案 2 :(得分:0)

编辑:刚刚意识到我的初步答案不起作用,因为你正在使用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})