【问题标题】:Same field name across different views not rendering correctly不同视图中的相同字段名称无法正确呈现
【发布时间】:2012-03-16 15:56:12
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这取决于您使用的 URL。如果你输入..../Index,那么它将进入索引视图,但如果你进入.../Index/1,那么它将进入主视图并渲染你的两个(这有点奇怪,因为 1 到 2 :))

    此外,您只会在POST 上点击Index(string id) 方法,所以这也可能是您的问题。典型的 URL 请求是 GET

    如果这没有帮助,那么您可能需要提供更多详细信息(您尝试访问哪个 URL,以及您尝试如何到达那里)

    自己尝试后更新

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

    Here is the documentation。在评论中,它确实声明这更多地用于模型绑定,但我原以为插入的值会覆盖其他任何内容。

    最终更新

    事实证明,这实际上已经被提出给适当的人,而且是设计使然。不过,他们应该更改文档以使其更加明确。 Here is the SO question that answers this

    【讨论】:

    • 我首先尝试导航到.../Index。在 Index 上提交表单后,它应该 POST 到控制器的 Index(string id) 方法并返回它当前执行的主视图。但是,问题在于主视图的源仍然将隐藏的输入字段值设置为“1”。我需要能够在不更改 URL 的情况下在此站点的页面之间导航。这有帮助吗?
    • 有趣,我自己尝试后更新了我的答案。如果你问我,这是一个错误......但我现在很好奇,正在做一些研究:)
    • 重新编辑了我发现的推理。 +1 对您遇到这样一个有趣问题的“菜鸟”的问题 :)
    • 是的,这似乎准确地描述了我遇到这个问题的原因。感谢您进行研究并链接到详细答案。猜猜我会用不同的名字命名我的隐藏输入字段。
    • 如果您的意图是定义每个页面上的值,您可以简单地使用标准 HTML 来解决绑定问题,即
    【解决方案2】:

    不要忘记路由引擎默认设置为将第三个段视为 ID。如果我没记错的话,路由参数将胜过表单参数:

    案例一:

    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
    

    【讨论】:

    • 感谢您的信息。我明白你在说什么,但在我的情况下,主视图上的隐藏表单 ID 值甚至在页面呈现时都没有设置为正确的值。我希望 @Html.Hidden("id", "2") 行在 Main 上生成 &lt;input id="pg" name="pg" type="hidden" value="2" /&gt;,但值是“1”。想法?
    • 回来和贾斯汀说了同样的话 - 在他的帖子中添加了一些额外的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2017-04-06
    相关资源
    最近更新 更多