【问题标题】:MVC crazy property lose its value. Does Html.HiddenFor bug?MVC 疯狂的属性失去了它的价值。 Html.HiddenFor 错误吗?
【发布时间】:2013-05-29 14:09:16
【问题描述】:

在我的 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);
        }
    }

当我调试代码时,在“渲染”阶段唯一调用选定登录并返回正确的登录。

Html.HiddenFor 有什么错误吗?

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    好的,这实际上是 Html.HiddenFor 的错误/错误行为。
    我在写问题时才想到这种可能性。


    我改成:

    <input type="hidden" value="@Html.AttributeEncode(Model.SelectedLogin)" id="SelectedLogin" name="SelectedLogin" />
    

    它工作得非常好。

    编辑:

    还有另一种解决方法。

    调用 ModelState.Clear();在控制器后操作中。
    我会使用这个选项。

    ModelState.Clear();
    

    +

    @Html.HiddenFor(m => m.SelectedLogin)
    

    【讨论】:

    • 不是反对者,但原因可能是这不是“Html.HiddenFor 的错误/错误行为”。如果使用ModelState.Clear() 有效,则似乎(无法从您的代码中看出)您的ModelState 中有一个SelectedLogin 属性(例如,发布到控制器操作的值),这与您的值不同模型。在选择值时,HTML 助手将始终选择 ModelState 而不是 Model。这是设计使然,而不是错误。
    【解决方案2】:

    我也遇到了这个问题,.cshtml 在返回页面时执行了两次,第二次运行时出现了空模型对象的问题。

    使用@Sergeanswer 修复了HiddenFor 的问题,但是我也遇到了无法通过这种方式解决的部分问题。

    事实证明这是一个间歇性问题,其中调用视图的Controller 方法正在设置ViewBag 属性以及通过protected internal ViewResult View(string viewName, object model); 分别返回视图+模型。

    我正在处理的项目到处都有这个,并且在其他控制器/视图上它工作正常。但是对于我维护的那个,HiddenFor 中的这个空问题正在发生。

    无论如何,我将所有 ViewBag 设置器从控制器中拉出,并将它们移动到模型对象的 NotMapped 属性中。

    完成此操作后,HiddenFor 呼叫等都开始再次运行。所以,不要混用你的 ViewBag 和 ViewModel 孩子。

    【讨论】:

      猜你喜欢
      • 2011-02-19
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多