Asp.net mvc MVC 4文本框在回发时未更新
我有一个表单,它使用的modelview对象在提交表单的回发时没有更新textbox值。提交表单时,我编辑绑定到文本框的对象的属性。当表单返回时,对象属性仍会更改,但textbox值不会更改。这就像文本框的值是缓存的,不会更改。我该如何解决这个问题 文本框默认值:“ 文本框代码: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
@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操作方法。