我有一个表单,它使用的模型视图对象在回发提交表单时不会更新文本框值。在提交表单时,我编辑绑定到文本框的对象的属性。表单返回时,对象属性仍然更改,但文本框值不会更改。就像文本框值被缓存一样,不会改变。我该如何解决这个问题?
文本框默认值:""
文本框代码:
@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;
}
}
文本框值:&#34;&#34;
编辑:用以下代码替换文本框的代码:
<input type="text" readonly="readonly" class="readonly" value="@Model.Project.tNumber" />
解决了这个问题。显然,正在缓存文本框。 简而言之,不要使用razor语法,好的旧HTML工作正常。 我希望这有助于其他人!
答案 0 :(得分:5)
TextBoxFor,DropDownListFor等编辑器使用ModelState值而不是传递给视图的模型中的值。 ModelState包含用户使用表单提交的值。
您可以在操作中调用ModelState.Clear()
来清除整个ModelState。然后编辑将使用您模型中的值。
这有点违反直觉。关于this thread的解释终于对我有意义了。
我们使用编辑器的已发布值而不是模型值的原因是模型可能无法包含用户键入的值。想象一下,在你的“int”编辑器中,用户输入了“dog”。您希望显示一条错误消息,其中显示“dog is not valid”,并在编辑器字段中保留“dog”。但是,你的模型是一个int:它无法存储“dog”。所以我们保留旧的价值。