我是MVC 3的新手,我有以下观点:
指数:
@using (Html.BeginForm())
{
@Html.Hidden("id", "1")
<input type="submit" value="Submit" />
}
主:
@using (Html.BeginForm())
{
@Html.Hidden("id", "2")
<input type="submit" value="Save" />
}
以下控制器:
public ActionResult Index()
{
ViewBag.Message = "Welcome!";
return View();
}
[HttpPost]
public ActionResult Index(string id)
{
if ("1".Equals(id))
{
return View("Main");
}
else("2".Equals(id))
{
return View();
}
}
我的期望是主视图将使用值“2”呈现隐藏的输入。但是,在到达主页面并检查源时,该值仍设置为“1”。知道我在这里做错了吗?
答案 0 :(得分:1)
这取决于您使用的网址。如果您输入..../Index
,那么它将转到索引视图,但是如果您要转到.../Index/1
,那么它将转到主视图并渲染您的两个(这有点奇怪,因为1转2:))
此外,您只会点击Index(string id)
上的POST
方法,因此这也可能是您的问题。典型的网址请求是GET
如果这没有帮助,那么您可能需要提供更多详细信息(您尝试访问的网址,以及您尝试访问的方式)
在尝试自己之后更新
我明白你在说什么。将隐藏字段设置为1的原因是因为ModelState会为您插入。据我所知,这不应该发生,因为你明确设置了值。但是,似乎如果存在匹配的状态项,它将使用它。您可以通过使用id
更改为Main隐藏输入名称中的任何其他内容来测试此项。
Here is the documentation。在备注中,它确实声明这对于模型绑定意味着更多,但我认为插入的值会覆盖其他任何内容。
最终更新
事实证明,这实际上已经提到了适当的人,这是设计的。但是,他们应该更改文档以使其更加明确。 Here is the SO question that answers this
答案 1 :(得分:0)
不要忘记默认设置路由引擎将第三个段视为ID。如果我没弄错,route参数将胜过表单参数,所以:
案例1:
URL: controller/index/
HIDDEN_ID: 1
= Action id parameter = 1 //from the hidden field
案例2:
URL: controller/index/2
HIDDEN_ID: 1
= action id parameter = 2 //from the url route not te hidden field