2012-03-16 82 views
2

我新的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”。任何想法我在这里做错了吗?

回答

1

这取决于您使用的URL。如果你输入的是..../Index,那么它会进入索引视图,但是如果你要去.../Index/1那么它会进入主视图并渲染你的两个(这很奇怪,因为1会变成2 :))

此外,您只会在POST上点击Index(string id)方法,因此也可能是您的问题。一个典型的URL请求遇到作为一个GET

如果没有帮助,那么你可能需要提供更多的细节(什么网址,你正在尝试打,你如何试图让那里)

在尝试这个自我后更新

我明白你在说什么。隐藏字段设置为1的原因是ModelState为您插入。据我所知,这是不应该发生的,因为你明确地设置了这个值。但是,看起来如果有一个匹配的状态项目,它将使用它。您可以通过将id更改为Main的隐藏输入名称中的其他任何内容来测试。

Here is the documentation。在备注中,它确实声明这对于模型绑定来说意味着更多,但我会认为插入的值会覆盖其他任何东西。

最后更新

原来,这其实已经长大到合适的人,它是由设计。尽管如此,他们应该修改文档以使其更加明确。 Here is the SO question that answers this

+0

我第一次尝试导航到'.../Index'。在索引上提交表单后,它应该向控制器的“索引(字符串id)”方法发布“POST”并返回它当前所做的主视图。但是,问题在于主视图的源代码仍然将隐藏的输入字段值设置为“1”。我需要能够在不改变URL的情况下浏览本网站的页面。这有帮助吗? – holic87 2012-03-16 16:07:53

+0

有趣的是,我自己试了一下之后更新了我的答案。如果你问我,这是一个错误......但我现在很好奇,并正在做一些研究:) – 2012-03-16 16:26:14

+0

重新编辑与我发现是推理。 +1对你的问题的一个“noob”遇到这样一个有趣的问题:) – 2012-03-16 16:33:22

0

不要忘记路由引擎默认设置为将第三段视为ID。如果我没有弄错的路由参数将战胜形式参数,以便:

案例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 
+0

感谢您的信息。我明白你在说什么,但在我的情况下,主视图上隐藏的表单ID值甚至在页面呈现时都没有设置为正确的值。我期待'@ Html.Hidden(“id”,“2”)'行生成'on主要的,但是值是“1”。思考? – holic87 2012-03-16 16:20:14

+0

回来跟贾斯汀说了同样的话 - 在他的文章中加入了一些额外的思想。 – 2012-03-16 16:49:53