在Post Post上,ASP.NET MVC ViewModel为null - 有时候

时间:2013-05-13 03:24:47

标签: asp.net-mvc-4 razor .net-4.0 postback asp.net-mvc-viewmodel

取决于我在HTML表单中的输入(6或6.5 - 或者一般来说,整数VS浮点数)我得到或者没有得到以下异常(它适用于int并且不适用于float):

  

传递到字典中的模型项为null,但此字典需要“System.Boolean”类型的非null模型项。

我的View的ViewModel是 null ,问题在自定义模板中可见,该模板需要bool值,但是会变为null。我们使用ASP.NET MVC 4和.Net 4.0,C#和Razor模板。

经过几个小时的调试后,我得出以下结论:

  • 发布表单数据是相同的(除了一个不同的属性,但看起来仍然正确)
  • 执行顺序在某种程度上奇怪地不同:
    • for int 我得到了Application_BeginRequest->过滤器,它通过我的属性运行 - > Action->查看渲染或重定向(一切正常)
    • for float 我得到了Application_BeginRequest->过滤器,它通过我的属性运行 - >查看渲染 - > END WITH AN EXCEPTION和Empty ViewModel

我已经检查了十几次 - >如果我传递 float ,View会以某种方式呈现,而不会执行任何Action(我会看到)(当然断点始终是相同的)。遗憾的是,一旦View被渲染,我就无法在StackTrace中看到任何东西。

我的观点的ViewModel是:

public class JabCommonViewModel
{
    public int JAB_ID { get; set; }
    [UIHint("Checkbox")]
    public bool JAB_gesperrt { get; set; }
    [UIHint("Checkbox")]
    public bool JAB_Kontrolliert { get; set; }
    public int e001 { get; set; }
    public string e002 { get; set; }
    public int e005 { get; set; }
    [UIHint("Checkbox")]
    public bool e013 { get; set; }
    public bool e014 { get; set; }
    public short? e015 { get; set; }
    public bool? e149 { get; set; }
    public int? e649 { get; set; }
    public int? e310 { get; set; }
    public int? LastJabe311 { get; set; }
    public int jabIdE013 { get; set; }
    public int jabIdPrev { get; set; }
    public int updCnt { get; set; }
    public int checks { get; set; }
    public bool calculateInEur { get; set; }

    public FormViewModel AktivaPassiva { get; set; }
    public FormViewModel GuV1GuV2 { get; set; }
    public FormViewModel GuV3 { get; set; }
    public ActsFormViewModel ActsForm { get; set; }
    public CommonDataViewModel CommonDataForm { get; set; }
    public CompanyHeadViewModel CompanyHeadForm { get; set; }
    public FacilitiesOverviewModel FacilitiesOverview { get; set; }
}

public class FormViewModel
{
    public string ShowAllCaption { get; set; }
    public string HideAllCaption { get; set; }
    public string CurrentCaption { get; set; }
    public string PreviousCaption { get; set; }
    public bool HasPreviousData { get; set; }

    public IEnumerable<FieldViewModel> Fields { get; set; } 

    public FormViewModel()
    {
        Fields = new FieldViewModel[0];
    }
}

public class FieldViewModel
{
    public string Name { get; set; }
    public string Title { get; set; }
    public object Value { get; set; }
    public bool IsDisabled { get; set; }
    public bool IsCollapsible { get; set; }
    public bool IsSpecialCase { get; set; } // used currently to expand/collapse groups on second level
    public FieldViewModel Previous { get; set; }
    public Category DataCategory { get; set; }
    public IEnumerable<FieldViewModel> Related { get; set; } 

    public FieldViewModel()
    {
        Related = new FieldViewModel[0];
    }

    public FieldViewModel(string name, string title, object value, bool isDisabled, Category dataCategory = Category.None, bool isCollapsible = true)
    {
        Name = name;
        Title = title;
        Value = value;
        IsDisabled = isDisabled;
        DataCategory = dataCategory;
        IsCollapsible = isCollapsible;
        Related = new FieldViewModel[0];
    }
}

....

回馈后行动是

public ActionResult Edit(JAB2 jab)
{
    ComponentFactory.Logger.Debug("Edit with JAB2");
    ....
}

public class JAB2 : JAB
{
    public int jabIdE013 { get; set; }

    public JAB LastJab { get; set; }

    public int checks { get; set; }
}

public class JAB : BaseModel
{
    public JAB()
    {
    }

    public bool e116 { get; set; }

    public bool e117 { get; set; }

    public bool e118 { get; set; }

    public bool e119 { get; set; }

    public bool e120 { get; set; }

    public bool e121 { get; set; }

    public bool e122 { get; set; }

    public bool e123 { get; set; }

    public bool e124 { get; set; }

    public bool e125 { get; set; }

    public short? e126 { get; set; }

    ... /* 100 more properties */ ...

    [LocalizedDisplayName("e751", NameResourceType = typeof(Resources.ModelPropertyNames))]
    public float? e751 { get; set; } /* the property which works as int but not as float */
}

Post-Back实际上是链接

  

/ JAB /编辑/

当e751(特殊属性)具有整数值时,仍然执行正确的方法。 我们还在该字段上使用autoNumeric-JavaScript Plugin。我们也将插件与其他字段一起使用,但到目前为止只发现了这个错误。同样,我们有一个工作站,我们无法重现错误,因此它发生在3个工作站中的2个+测试服务器上。

到目前为止,我发现的任何内容都没有解释它有时会起作用的事实。

非常感谢你花时间阅读我的帖子。

你有什么想法可能是错的或我可以检查什么?

0 个答案:

没有答案