首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Html.BeginForm的奇怪行为

Html.BeginForm的奇怪行为
EN

Stack Overflow用户
提问于 2012-01-13 04:26:35
回答 2查看 1K关注 0票数 1

让我们创建空的asp.net MVC3应用程序。代码是

代码语言:javascript
复制
namespace MvcApplication1.Controllers
{
public class MyModel
{
    public int Id { get; set; }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return Index1(new MyModel() {Id = 100});
    }
    public ActionResult Index1(MyModel model)
    {
        var nm = new MyModel();
        nm.Id = model.Id + 1;
        return View("test", nm);
    }
}

让我们创建一个名为test的共享视图。查看代码是

代码语言:javascript
复制
@using MvcApplication1.Controllers
@model MyModel

@if (Model != null)
{
    using (Html.BeginForm("Index1", "Home", FormMethod.Post, new { autocomplete = "off" }))
    {
    <div id="compareQuestions">
        <p>@Model.Id</p>
        @Html.HiddenFor(m => m.Id)
        @Html.TextBoxFor(m => m.Id)
        <input type="submit" value="save"/>
    </div>
    }
}

当我们第一次发布表单时,一切都是正常的,但当它在第一次发布后重新加载文本框中的值时就不正确了。如果我们改变这个值并在控制器上保存post,我们得到的模型有不正确的值,但不是我们输入的值。这怎麽可能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-13 05:10:35

<p>@Model.Id</p>@Html.HiddenFor(m => m.Id)有很大的不同。

当您发布表单时,所有发布的值都存储在ModelState中。

当您使用HtmlHelper方法时,它们首先从ModelState中提取值。如果ModelState不包含值,那么它将查看实际的m.Id

因此,当您第一次获得表单时,没有ModelState。但是一旦您发布表单,它就会将值存储到ModelState中,因此隐藏的输入将使用该值而不是m.Id

如果您希望始终使用m.Id,则需要清除控制器中的ModelState

代码语言:javascript
复制
public ActionResult Index1(MyModel model)
{
    ModelState.Clear();
    ...
票数 2
EN

Stack Overflow用户

发布于 2012-01-13 04:48:27

看起来这是正确的行为,因为您已经编写了您的操作方法。在视图中,您将为同一模型属性呈现文本框和隐藏字段。

因此,当您在post期间将Id递增1时,您将递增文本框和隐藏字段中的值。

如果你想让文本框和隐藏字段在第二篇文章之后有不同的值,你需要在你的模型上有一个不同的属性。

另一个问题可能是,因为您有两个同名的不同<input元素,所以您不能确定表单将发送隐藏字段或文本框中的值。同样,如果这两个字段应该具有不同的值,则它们需要在模型上具有不同的属性。如果希望它们总是相同的值,可以在视图中放入TextBox或Hidden,但不能同时放入这两个值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8841795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档