不同视图中的相同字段名称无法正确呈现

时间:2012-03-16 15:56:13

标签: c# asp.net asp.net-mvc-3 c#-4.0 razor

我是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”。知道我在这里做错了吗?

2 个答案:

答案 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