Asp.net mvc 修改ViewModel后不工作的MVC4 HTML文本框
我有一个我真的不明白的问题。我有一个非常简单的模型,其中有一个作为公共成员的列表。每当我的控制器在回发时从模型中删除一个元素时,TextBoxFor()HTML帮助程序似乎不会接受这些更改。这些助手似乎正在缓存某些内容,但我无法确定 可在此处找到演示/复制: 复制Asp.net mvc 修改ViewModel后不工作的MVC4 HTML文本框,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我有一个我真的不明白的问题。我有一个非常简单的模型,其中有一个作为公共成员的列表。每当我的控制器在回发时从模型中删除一个元素时,TextBoxFor()HTML帮助程序似乎不会接受这些更改。这些助手似乎正在缓存某些内容,但我无法确定 可在此处找到演示/复制: 复制 导航到 请注意,4列值中填充了基于零的值 点击“测试”按钮返回我删除列表中第一项的页面 请注意,“real”值是正确的,0元素已被删除,但是这里的问题是通过TextBoxFor()呈现的值。我无法理解为什么当0元素不再存在时,它仍呈现
型号
public class ItemViewModel
{
public string Description { get; set; }
public decimal? Amount { get; set; }
}
public class TestViewModel
{
public TestViewModel()
{
Items = new List<ItemViewModel>();
}
public List<ItemViewModel> Items { get; set; }
}
公共类ItemViewModel
{
公共字符串说明{get;set;}
公共小数?金额{get;set;}
}
公共类TestViewModel
{
公共TestViewModel()
{
项目=新列表();
}
公共列表项{get;set;}
}
控制器
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new TestViewModel();
for (var i = 0; i < 4; i++)
{
model.Items.Add(new ItemViewModel { Description = i.ToString(), Amount = i });
}
return View(model);
}
[HttpPost]
public ActionResult Index(TestViewModel model)
{
model.Items.RemoveAt(0);
return View(model);
}
}
公共类HomeController:控制器
{
公共行动结果索引()
{
var模型=新的TestViewModel();
对于(变量i=0;i<4;i++)
{
model.Items.Add(新的ItemViewModel{Description=i.ToString(),Amount=i});
}
返回视图(模型);
}
[HttpPost]
公共行动结果索引(TestViewModel)
{
model.Items.RemoveAt(0);
返回视图(模型);
}
}
查看
@model Demo.Models.TestViewModel
@using (Html.BeginForm())
{
<table>
<thead>
<tr><td>Description</td><td>Amount</td><td>Real-Description</td><td>Real-Amount</td></tr>
</thead>
<tbody>
@for (var i = 0; i < Model.Items.Count; i++)
{
var ii = i;
<tr>
<td>@Html.TextBoxFor(m => m.Items[ii].Description)</td>
<td>@Html.TextBoxFor(m => m.Items[ii].Amount)</td>
<td>@Model.Items[ii].Description</td>
<td>@Model.Items[ii].Amount</td>
</tr>
}
</tbody>
</table>
<button>Test</button>
}
@model Demo.Models.TestViewModel
@使用(Html.BeginForm())
{
描述装入实际描述实际金额
@对于(变量i=0;im.Items[ii].说明)
@Html.TextBoxFor(m=>m.Items[ii].Amount)
@模型.项目[ii].说明
@模型.项目[ii].金额
}
试验
}
根据所需的行为,按如下所示更改帖子索引方法:
[HttpPost]
public ActionResult Index(TestViewModel model)
{
ModelState.Clear();
model.Items.RemoveAt(0);
return View(model);
}
原因如下:
TextBoxFor绑定到ModelState中的后置值,而不是模型值。因此,在您的应用程序中,当您点击Test按钮时,文本框将绑定到它们已有的值,即使在更改模型值后,也不会在回发时更新。对于ex,如果第一行中的文本框显示0,并且即使在回发之后,它们仍将绑定到该值,并且基础模型的值为1。这种行为背后的原因是验证。如果您希望文本框中出现int,并且用户输入“SomeTextValue”,则模型绑定器将无法绑定到int属性,并且将处于验证错误状态。然后,您希望用户看到一个错误,该错误表示“SomeTextValue”不是整数。请输入一个整数,因为您希望用户输入的值在那里
Rick Strahl在这篇博客文章中完美地解释了这一点
和品牌威尔逊如下:
谢谢,我相信这就是问题所在。我将测试并报告。