2014-09-26 13 views
1

我有一个表单使用不提供表单回发时更新文本框值的模型视图对象。在提交表单时,我编辑绑定到文本框的对象的属性。当窗体返回时,对象属性仍会更改,但文本框值不会更改。这就像文本框的值被缓存,不会改变。我该如何解决?MVC 4文本框未在回发中更新

文本框默认值: “”

文本框代码:

@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); 
} 

视图模型方法:

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; 
    } 
} 

文本框的值: “”

编辑:与此替换的代码文本框:

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

已经解决了这一问题。显然,该文本框正在被缓存。 总之,不要使用剃刀语法,好的旧html工作正常。 我希望这可以帮助别人!

+0

什么是您的控制器动作签名?在解决这些问题时,Fiddler是你最好的朋友,它几乎总是与命名 – reckface 2014-09-26 14:50:06

+0

并且你说文本框是只读的!?! – reckface 2014-09-26 14:50:36

+0

您是否将更改后的视图模型推回到视图中?也就是说,作为回应,你需要做'返回视图(“视图名称,模型)''而不是只是'返回视图(”视图名称“)' – tweray 2014-09-26 14:55:44

回答

5

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

您可以通过在您的操作中调用ModelState.Clear()来清除整个ModelState。然后编辑会使用模型中的值代替。

这有点违反直觉。对this thread的解释终于对我有意义了。

我们使用发布的值来编辑而不是模型值的原因是模型可能无法包含用户输入的值。想象一下,在你的“int”编辑器中,用户输入了“狗”。您想要显示一条错误消息,指出“狗无效”,并将“狗”留在编辑器字段中。然而,你的模型是一个int:它不可能存储“狗”。所以我们保持旧的价值。