ASP.NET MVC 5 Html.HiddenFor呈现不正确的属性值,但Model.Property呈现正确的值

Mik*_*sen 4 asp.net-mvc razor asp.net-mvc-5

  • Visual Studio 2013专业版
  • C#
  • .NET 4.5 Framework
  • ASP.NET MVC 5

在我的视图模型类中,我有一个名为的属性SerializedSelf,用于将自身表示为序列化字符串,也可以反序列化,但仅限于尚未初始化的任何属性.我使用它来通过使用具有此值的单个隐藏输入来简化视图模型的往返.在传递给控制器​​方法之前,框架将在模型中填充与模型相关的任何其他输入.

我遇到的问题是,在我的剃刀视图代码中,这不能正确呈现:

 @Html.HiddenFor(model => model.SerializedSelf)
Run Code Online (Sandbox Code Playgroud)

我还没有确定它是否正在序列化一个完全未初始化的MyViewModel对象,或者它是否是来自其他地方的实例.

但这很正常:

 <input type="hidden" name="SerializedSelf" id="SerializedSelf" value="@Model.SerializedSelf" />
Run Code Online (Sandbox Code Playgroud)

所以我猜它可能与lambda表达式和附件有关??? 当我在源代码中单步执行时,在SerializedSelf调用之前它具有正确的值return View("myView", model).

这是视图模型代码:

using Newtonsoft.Json;
using System;
using System.Text;

public class MyViewModel
{
    [JsonIgnore]
    public string SerializedSelf
    {
        get
        {
            return JsonConvert.SerializeObject(this);
        }
        set
        {
            if (string.IsNullOrWhiteSpace(value)) return;

            string json = value;
            MyViewModel copy = JsonConvert.DeserializeObject<MyViewModel>(json);
            if (Message == null) Message = copy.Message;
            if (Phone == null) Phone = copy.Phone;
            // ...
        }
    }

    public string Message { get; set; }
    public string Phone { get; set; }
    // ...

}
Run Code Online (Sandbox Code Playgroud)

有什么区别:

@Html.HiddenFor(model => model.SerializedSelf)
Run Code Online (Sandbox Code Playgroud)

@Model.SerializedSelf
Run Code Online (Sandbox Code Playgroud)

什么会导致前者不准确?

更新2013/12/5:我在适当的时候删除了逻辑SerializedSelf并显式序列化/反序列化SerializedSelf,以测试它是否有任何影响.它没有影响,行为就像我上面所描述的那样.

更新2013/12/5:删除了HTML编码和解码.从之前的解决问题尝试中遗留下来.

更新2013/12/5:我今天没有时间研究这个问题,但我发现可能[JsonIgnore]属性上的SerializedSelf属性是罪魁祸首,而且它干扰了MVC框架中的某些内容.我会尽快调查并更新.

Ufu*_*arı 11

如果在呈现视图以响应POST请求后发生这种情况,您应该知道HTML帮助程序使用旧值,因为它们认为存在验证错误.您可以在此博客文章中找到详细说明.