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?

MVC疯狂属性失去了它的价值.Html.HiddenFor bug

好的,这实际上是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孩子混在一起。