現在MVCアプリケーションを構築しており、選択したドロップダウンに基づいて車のリストを表示しようとしています。ユーザーが検索するために複数のドロップダウンを選択する必要はありません。ドロップダウンの任意の組み合わせでコードを検索できるようにしたいのです。If elseステートメントを使用してコードを記述し始めましたが、これがベストプラクティスだとは思わなかったため、調査を行って、結果をフィルタリングする別の方法を見つけました。私が抱えている問題は、モデルでnull値を取得していることです。
これは私のモデルです
public partial class Car
{
private Ignition_Hub_DBEntities Context;
public IQueryable<Car> GetProducts(Car searchModel)
{
var result = Context.Cars.AsQueryable();
if (searchModel != null)
{
if (searchModel.CarLotID.HasValue)
result = result.Where(x => x.CarLotID == searchModel.CarLotID);
if (searchModel.Available.HasValue)
result = result.Where(x => x.Available == searchModel.Available);
if (searchModel.ModelID.HasValue)
result = result.Where(x => x.ModelID == searchModel.ModelID);
if (searchModel.Model.MakeID.HasValue)
return result;
result = result.Where(x => x.Model.MakeID == searchModel.Model.MakeID);
return result;
}
return result;
}
public Car()
{
Context = new Ignition_Hub_DBEntities();
}
public int? CarID { get; set; }
public string Year { get; set; }
public string Notes { get; set; }
public bool? Available { get; set; }
public string VinNumber { get; set; }
public int? CarLotID { get; set; }
public int? ModelID { get; set; }
public virtual Model Model { get; set; }
public virtual CarLot CarLot { get; set; }
}
これは私のコントローラーです
public ActionResult DisplaySearchResults(Car searchModel)
{
var business = new Car();
var model = business.GetProducts(searchModel);
return PartialView("_Index", model);
}
今、私はエラーでif (searchModel.Model.MakeID.HasValue)
エラーが発生し'Object reference not set to an instance of an object.'
ます。助けてくれてありがとう!これを達成するためのより良い方法がある場合は、アドバイスしてください。ありがとうございました!
あなたは確認する必要がありModel
、あなたが確認する必要があります検索するときに、検索モデルのプロパティがnullでなく、アクションに渡されたModel
LINQクエリ内の要素のプロパティがnullでない場合、比較MakeID
して、検索モデルのプロパティをMakeID
プロパティlinqクエリの要素の。たとえば、あなたがに基づいて検索しようとしている場合MakeID
のModel
、それが指定されていた場合、あなたは次のようにコードを変更する必要があります。
if (searchModel.Model !=null && searchModel.Model.MakeID.HasValue)
result = result.Where(x => x.Model !=null &&
x.Model.MakeID == searchModel.Model.MakeID);
ただし、この投稿をフォローしている場合は、一般的に次のアドバイスに従うことをお勧めします。
例
リンクされた投稿から例を拡張するので、にProduct
もCategory
プロパティがあり、CategoryName
他のいくつかのプロパティに基づいて検索することに関心があります。
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Product
{
public int Id { get; set; }
public int Price { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public Category Category { get; set; }
}
ProductSearchModel
クラスを作成し、それらに基づいて検索するいくつかのフィールドを配置できます。
public class ProductSearchModel
{
public int? Id { get; set; }
public int? PriceFrom { get; set; }
public int? PriceTo { get; set; }
public string Name { get; set; }
public string CategoryName { get; set; }
}
次に、次のように検索ロジックをProductBusinessLogic
クラスに配置できます。
public class ProductBusinessLogic
{
private YourDbContext Context;
public ProductBusinessLogic()
{
Context = new YourDbContext();
}
public IQueryable<Product> GetProducts(ProductSearchModel searchModel)
{
var result = Context.Products.AsQueryable();
if (searchModel != null)
{
if (searchModel.Id.HasValue)
result = result.Where(x => x.Id == searchModel.Id);
if (!string.IsNullOrEmpty(searchModel.Name))
result = result.Where(x => x.Name.Contains(searchModel.Name));
if (searchModel.PriceFrom.HasValue)
result = result.Where(x => x.Price >= searchModel.PriceFrom);
if (searchModel.PriceTo.HasValue)
result = result.Where(x => x.Price <= searchModel.PriceTo);
if (!string.IsNullOrEmpty(searchModel.CategoryName))
result = result.Where(x => x.Category !=null &&
x.Category.Name.Contains(searchModel.Name));
}
return result;
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加