Asp.net mvc MVC 4文本框在回发时未更新

Asp.net mvc MVC 4文本框在回发时未更新,asp.net-mvc,textbox,model-view,Asp.net Mvc,Textbox,Model View,我有一个表单,它使用的modelview对象在提交表单的回发时没有更新textbox值。提交表单时,我编辑绑定到文本框的对象的属性。当表单返回时,对象属性仍会更改,但textbox值不会更改。这就像文本框的值是缓存的,不会更改。我该如何解决这个问题 文本框默认值:“ 文本框代码: @Html.TextBoxFor(m => m.Project.tNumber, new { @readonly = "readonly", @class = "readonly" }) 对象属性: [Disp

我有一个表单,它使用的modelview对象在提交表单的回发时没有更新textbox值。提交表单时,我编辑绑定到文本框的对象的属性。当表单返回时,对象属性仍会更改,但textbox值不会更改。这就像文本框的值是缓存的,不会更改。我该如何解决这个问题

文本框默认值:“

文本框代码:

@Html.TextBoxFor(m => m.Project.tNumber, new { @readonly = "readonly", @class = "readonly" })
对象属性:

[Display(Name = "T Number")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public string tNumber { get; set; }
控制器动作方法:

[Authorize(Roles = "Admin, OrderEntryManager")]
[HttpPost]
public ActionResult Verify(string submit, OrderEntryEdit model)
{
    MembershipUser user = Membership.GetUser(User.Identity.Name);
    int userId = WebSecurity.GetUserId(User.Identity.Name);
    if (userId > 0)
    {
        if (ModelState.IsValid)
        {
            string ButtCommand = submit;
            switch (ButtCommand)
            {
                case "Create Order":
                if (model.CreateOrder(userId))
                {
                    ViewBag.Status = "success";
                    ViewBag.Message = "The order has been created.";
                }
                else
                {
                    ViewBag.Status = "error";
                    ViewBag.Message = "There was a problem in trying to create this order.";
                }
                default:
                    ViewBag.Status = "error";
                    ViewBag.Message = "Unrecognized form action.";
            }
        }
    }
    else
    {
        ViewBag.Status = "error";
        ViewBag.Message = "Unrecognized user.";
    }
    return View("Verify", model);
}
ViewModel方法:

public class OrderEntryEdit : OrderEntry
{
    public OrderEntryEdit()
    {
        base.Project = new Project();
        base.ShipTo = new ShipTo();
        base.SoldTo = new SoldTo();
        base.Unit = new List<Unit>();
    }
    //method simplified, but is reaching this method
    public Boolean CreateOrder(int adminUserId = 0)
    {
        this.Project.tNumber = "T123456";
        return true;
    }
}
公共类OrderEntryEdit:OrderEntry { public OrderEntryEdit() { base.Project=新项目(); base.ShipTo=新ShipTo(); base.SoldTo=新的SoldTo(); base.Unit=新列表(); } //方法简化了,但正在达到此方法 公共布尔CreateOrder(int adminUserId=0) { this.Project.tNumber=“T123456”; 返回true; } } 文本框值:“

编辑:将文本框的代码替换为:

<input type="text" readonly="readonly" class="readonly" value="@Model.Project.tNumber" />

解决了这个问题。显然,文本框正在被缓存。 简而言之,不要使用razor语法,好的旧html很好用。
我希望这对其他人有帮助

TextBoxFor、DropDownListFor等编辑器使用ModelState值,而不是传递给视图的模型中的值。ModelState包含用户随表单提交的值

通过在操作中调用
ModelState.clear()
,可以清除整个ModelState。然后编辑器将使用模型中的值

这有点违反直觉。关于这个问题的解释终于让我明白了

我们对编辑器使用POST值而不是模型值的原因是模型可能无法包含用户键入的值。想象一下,在“int”编辑器中,用户输入了“dog”。您希望显示一条错误消息,说明“dog无效”,并在编辑器字段中保留“dog”。然而,您的模型是一个int:它无法存储“dog”。因此,我们保留旧值


您的控制器操作签名是什么?在解决这些问题时,Fiddler是你最好的朋友,它几乎总是与Naming有关,而且你说过文本框是只读的!?!您是否将更改后的viewmodel推回到视图中?i、 e.作为响应,您需要执行
返回视图(“ViewName”,model)
而不是只执行
返回视图(“ViewName”)
确定,在回发时检查fiddler中的对象属性会显示tNumber值为空,但是视图上的条件被触发,就好像值不是空的一样。请编辑您的问题并发布完整的post操作方法。