15

定義が次のように見えるコントローラーアクションがあります-

public ActionResult ChangeModel( IEnumerable<MyModel> info, long? destinationId)

そしてモデル:

public class MyModel
{
    public string Name; //Gets populated by default binder
    public long? SourceId; //remains null though the value is set when invoked
}

'Name'プロパティはコントローラーアクションに入力されますが、SourceIdプロパティはnullのままです。長いdestinationId _ パラメータも入力されます。

MVC(バージョン2)ソースコードをステップ実行している間、これはDefaultModelBinderによってスローされる例外です。

タイプ'System.Int32'からタイプ'System.Nullable`1[[System.Int64、mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]]'へのパラメーター変換が失敗しました。これは、タイプコンバーターが変換できないためです。これらのタイプ。

モデルがlong?ではなくlongに変更された場合、デフォルトのモデルバインダーが値を設定します。

public class MyModel
{
    public string Name {get;set;}; //Gets populated by default binder
    public long SourceId {get;set;}; //No longer long?, so value gets set
}

これは既知の問題ですか?MVCソースコードが最適化されているため、ほとんどのコードをステップスルーできません。

更新:送信されるリクエストは、Jsonを使用したHttp POSTであり、ソースJSonは次のようになります-

{"info":[{"Name":"CL1","SourceId":2}], "destinationId":"1"}
4

3 に答える 3

4

手遅れかもしれませんが、回避策を見つけました。データを送信する前に、SourceId フィールドを文字列に変換できます。したがって、JSONデータは次のようになります

{"info":[{"Name":"CL1","SourceId":"2"}], "destinationId":"1"}

これは私の状況でうまくいきました (Int32 -> decimal?, ASP NET MVC 3)

于 2011-10-18T05:22:57.987 に答える
2

ビュー モデルでは、フィールドの代わりにプロパティを使用することをお勧めします。

public class MyModel
{
    public string Name { get; set; }
    public long? SourceId { get; set; }
}

今、次の要求:

/somecontroller/changemodel?destinationId=123&info[0].Name=name1&info[0].SourceId=1&info[1].Name=name2&info[1].SourceId=2

モデルにうまく移入します。

于 2011-05-02T19:04:42.593 に答える
1

Default Model Binder は、すべてのSourceId値を int として解析しています。intしかし、.NET には からへのデフォルトの型コンバーターがないようですlong?

私がすることは、その場合の型コンバーターを実装することです。

于 2011-05-02T13:35:28.047 に答える