MVC疯狂属性失去了它的价值.Html.HiddenFor bug
本文关键字:Html HiddenFor bug 疯狂 属性 失去 MVC | 更新日期: 2023-09-27 18:15:48
在我的MVC应用程序中发生了一些非常奇怪的事情,使我发疯。在我的MVC页面上,在用户被选中后,它的登录应该在HTML上"渲染"两次。一次以
的形式出现FrmNextStep('<Login>', ...
(where Model.SelectedUser.Login is used)
一次以
的形式出现<input id="SelectedLogin" name="SelectedLogin" value="<Login>" type="hidden">
(where "Model".SelectedLogin is used)
,但第二个总是保持空白。这真的很奇怪,因为尽管这两个调用不完全相同,返回值应该是。
if (Model.SelectedUser != null)
{
<span>Some value</span>
<script type="scriptADResultComplete">
@{
var script = String.Format(
@"FrmNextStep('{0}', '{1}', '{2}');"
, Model.SelectedUser.Login.Replace("'", @"''")
, Model.SelectedUser.FirstName.Replace("'", @"''")
, Model.SelectedUser.LastName.Replace("'", @"''")
);
@Html.Raw(script);
}
</script>
}
<input type="hidden" name="hfAction" />
<input type="hidden" name="hfUserLogin" />
@Html.HiddenFor(m => m.CurrentPage, new { id = "hfCurrentPage" })
@Html.HiddenFor(m => m.SelectedLogin);
private User selectedUser;
public User SelectedUser
{
get
{
if (this.selectedUser == null)
{
this.selectedUser = this.AllUsers.FirstOrDefault(user => user.Selected) ?? User.DefaultUser;
}
if (this.selectedUser == User.DefaultUser)
{
return null;
}
return this.selectedUser;
}
set
{
this.AllUsers.ForEach(user => user.Selected = (user == value));
this.selectedUser = null;
}
}
public string SelectedLogin
{
get
{
return (this.SelectedUser ?? User.DefaultUser).Login;
}
set
{
this.SelectedUser = this.AllUsers.FirstOrDefault(user => user.Login == value);
}
}
当我调试代码时,在"呈现"阶段唯一调用Selected Login并返回正确的登录。
是否有任何bug与Html.HiddenFor?
好的,这实际上是Html.HiddenFor的一个错误/错误行为。
这种可能性是我在写问题的时候才想到的。
我把它改成:
<input type="hidden" value="@Html.AttributeEncode(Model.SelectedLogin)" id="SelectedLogin" name="SelectedLogin" />
它工作得很好。
编辑:还有另一个方法。
调用ModelState.Clear ();在控制器post动作中。
我将使用这个选项。
ModelState.Clear();
+ @Html.HiddenFor(m => m.SelectedLogin)
我也有这个问题,.cshtml在返回页面时执行两次,第二次运行有null模型对象的问题。
使用@Serge的答案修复了HiddenFor
,但随后我也遇到了无法通过这种方式解决的部分问题。
这是一个间歇性的问题,其中调用视图的Controller
方法通过protected internal ViewResult View(string viewName, object model);
分别设置ViewBag
属性和返回视图+模型。
我正在工作的项目有这个地方,并在其他控制器/视图它工作得很好。但是对于我正在维护的那个,HiddenFor
中的null问题正在发生。
无论如何,我从控制器中取出所有ViewBag
设置,并将它们移动到模型对象上的NotMapped
属性中。
一旦这样做了,HiddenFor
调用等都开始再次行为。所以,不要把ViewBag和ViewModel孩子混在一起。