1

Locationループ内で、型を持つオブジェクトをプロパティに追加しようとしていList<Location>ます。

コントローラ:

 [HttpPost]
 public ActionResult Index([Bind(Include = "CitySearch")]HomeViewModel model)
 {
    List<CityIdentity> ids = null;
    ids = service.GetNamesId(model.CitySearch);

    foreach (var id in ids)
    {
        var loc = service.GetLocation(id.CityId);
        var location = new Location
        {
            CityId = id.CityId,
            Place = loc.Place,
        };
        model.Locations.Add(location);
    }
}

ビューモデル:

public class HomeViewModel
{
    public string CitySearch { get; set; }

    public List<Location> Locations { get; set; }

}

modelは typeHomeViewModelであり、プロパティLocationsは typeList<Location>です。ビューでフォームを送信するフォーム アクションのmodelインスタンスです。HttpPost

デバッグ中にエラーが発生しmodel.Locations.Add(location)object reference not set to an instance of an object.nullref 例外が発生しています。

何か案が?

4

2 に答える 2

2

何か案が?

はい、model変数が null であるか、Locationsプロパティが null です。そのため、アクセスする前に null でないことを確認してmodel.Locationsください。それ以外の場合、発生する例外は完全に正常です。null インスタンスでメソッドを呼び出すことはできません。ちなみに、標準のデバッグ手法 (コードにブレークポイントを設定し、アプリケーションをデバッグ モードで実行し、変数の値を調べる) を使用しても、同じ結論に達することができます。

あなたのmodelormodel.Locationsプロパティが null である理由は、まったく別の問題です。あなたが送信したフォームには、standard naming conventions for binding to a List. デフォルトのモデル バインダーが POST アクションでモデルをリハイドレートできると予想される場合は、これらの規則をよく理解し、それらを尊重することをお勧めします。

as action 引数を入れて、modelASP.NET MVC がどこかから自動的にそれを設定することを期待したのではないでしょうか? いいえ、それは ASP.NET MVC のしくみではありません。魔法はありません。ASP.NET MVC は、厳密な規則を持つモデル バインダーを使用します。アクションに引数として送信したものだけが、返されることが期待できます。

于 2013-01-08T21:48:27.193 に答える
2

あなたの反応とコンテキストに基づいて、あなたのLocationsプロパティはその時点で初期化されていないようです。そのため、Addこのコレクションでメソッドを使用することはできません. この問題を解決するには、まずこのプロパティを初期化する必要があります。その後、必要な方法で操作できます。

Locationsこれを実現する 1 つの方法は、モデルのコンストラクター (または適切と思われる場所) でプロパティを初期化することです。

したがって、次のようなものを追加するだけで、準備完了です。

Locations = new List<Location>();

これにより、メソッドを使用するのに十分なプロパティが初期化されます。

于 2013-01-08T22:07:38.080 に答える