我开始学习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">索引
任何提示?
答案 0 :(得分:3)
如下所示更改您的JS
function OnClick_prev() {
var loc = '@Url.Action("Index", "Index", new {id = (int)ViewBag.width+5})';
window.location = loc;
}
答案 1 :(得分:1)
问题是ViewBag
的基础类型是ExpandoObject,ExpandoObject
实际上是Dictionary<string, object>
,因此ViewBag.width+5
相当于
object + int
不会编译。在执行计算之前,您需要将width
属性转换为int
{ id = ((int)ViewBag.width + 5) }
答案 2 :(得分:0)
将您的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})