mvc2 html.valuefor,MVC @Html.EditorFor缓存Model的值是bug吧?小心入坑

最近遇到一个ASP.NET mvc的问题。

需求是这样的:在新增页面新增成功后,页面输入的控件全部清空,并输出添加成功文字。

前台页面:

50f4844bde5920235a2b3f0e5d0306a8.png

后台代码:

public ActionResult Add()

{

var m = new MPart();

return View(m);

}

[HttpPost]

public ActionResult Add([Bind(Exclude = "OID")]MPart model)

{

if (string.IsNullOrEmpty(model.CodeNo))

ModelState.AddModelError("error", "零件编号不能为空!");

else if (string.IsNullOrEmpty(model.Name))

ModelState.AddModelError("error", "零件名称不能为空!");

if (ModelState.IsValid)

{

var user = LoginStateHelper.CurrentUserOrDefault;

var r = PartService.Insert(model);

ViewBag.Message = "添加成功!";

model = new MPart();

return View(model);

}

else

return View(model);

}

运行结果出入意料的是:在新增页面新增成功后,页面输入的控件值并没有清空。可以从上面代码可以看到返回的是一个全新的Model对象,new了一个新模型对象。

结果如下图:

43a221d85667aac229c41d8b5c6bb387.png

解决办法:

在返回视图之前加上:ModelState.Clear()

8a800b90f858fdbfe6c7b8be7f4bce85.png

最后结果就是我所期望的。

28fde89f1674cbb70a9cbf3eace6884e.png

原因分析:

InputHelper方法(Html.EditorFor)会先从当前ModelState中获取,如果该值在ModelState中不存在,才会从当前ViewData中获取。

public static class InputExtensions

{

private static MvcHtmlString InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, string format, IDictionary htmlAttributes);

}

private static MvcHtmlString InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, string format, IDictionary htmlAttributes)

{

switch (inputType)

{

default:

{

string str4 = (string) htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string));

tagBuilder.MergeAttribute("value", str4 ?? (useViewData ? htmlHelper.EvalString(fullHtmlFieldName, format) : str2), isExplicitValue);

goto Label_016C;

}

}

}

同理@Html.TextBoxFor、@Html.EditorFor、@Html.EditorForModel也有同样的问题,用得时候要多注意,小心入坑。

延伸阅读:

http://www.cnblogs.com/artech/p/asp-net-mvc-bug.html

http://stackoverflow.com/questions/1775170/asp-net-mvc-modelstate-clear

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值