1

HTML フォーム (6 または 6.5 - または一般的に整数 VS float) での入力に応じて、次の例外が発生する場合と発生しない場合があります (int では機能し、float では機能しません)。

ディクショナリに渡されたモデル アイテムは null ですが、このディクショナリには 'System.Boolean' 型の null 以外のモデル アイテムが必要です。

私のビューのViewModelはnullであり、bool値を期待するカスタムテンプレートで問題が表示されますが、代わりにnullになります。ASP.NET MVC 4 と .Net 4.0、C#、および Razor テンプレートを使用しています。

数時間のデバッグの後、次の結論に達しました。

  • Post Form-Data は同一です (1 つのプロパティは異なりますが、それでも正しいように見えます)。
  • 実行順序は、どういうわけか奇妙に異なります。
    • intの場合、Application_BeginRequest->属性を実行するフィルター->アクション->ビューレンダリングまたはリダイレクト(すべて通常)を取得します
    • floatの場合、属性を介して実行される Application_BeginRequest->Filter を取得します->View Rendering-> END WITH AN EXCEPTION および Empty ViewModel

私はそれを何十回もチェックしました->フロートを渡すと、アクション(私が見たであろう)を実行せずにビューが何らかの形でレンダリングされます(もちろん、ブレークポイントは常に同じでした)。残念ながら、ビューがレンダリングされると、StackTrace には何も表示されなくなりました。

私のビューのビューモデルは次のとおりです。

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 */
}

ポストバックは実際にはリンクへ

/JAB/編集/

e751 (特別なプロパティ) が整数値を持つ場合でも、正しいメソッド get が実行されます。また、そのフィールドでautoNumeric-JavaScript プラグインを使用します。また、プラグインを他のフィールドで使用していますが、これまでのところ、このフィールドでのみエラーが見つかりました。同様に、エラーを再現できないワークステーションが 1 つあるため、3 つのワークステーションのうち 2 つとテスト サーバーでエラーが発生します。

これまでのところ、時々機能するという事実を説明するものは何も見つかりませんでした。

時間を割いて私の投稿を読んでくれてありがとう。

何が間違っているのか、何を確認できるのか、何かアイデアはありますか?

4

0 に答える 0