1

したがって、データベースを検索するための ViewModel があります。結果セットのコレクションをリファクタリングするつもりです。このViewModelには属していないと思います。私がやりたいのは、ユーザーがページを送信したときに、コントローラ アクションに渡された ViewModel と TempData に格納されている ViewModel を比較することだけです。したがって、SameSearch かどうかはわかります。

では、どうすればそれができるのでしょうか? viewModel に多くのプロパティがあることを考えると、1 つずつ比較したくありません。そして、Json.Encode を使用してそれらをシリアル化し、比較するのは、私には「ハッキー」に思えます。

また、1つずつ比較する必要がある場合。オーバーライドしてそれを行う必要がありますか.Equals()

コントローラーアクションSearch()

public ActionResult Search(SearchViewModel model)
{
    SearchViewModel savedSearch = null;

    if (Request["submit"].Equals("reset",StringComparison.OrdinalIgnoreCase))
    {
        TempData.Remove("filter");
        model = new SearchViewModel();
    }
    else if (TempData.ContainsKey("filter"))
    {
        savedSearch = (SearchViewModel)Convert.ChangeType(TempData["filter"], typeof(SearchViewModel));
    }

    var currentmodel = System.Web.Helpers.Json.Encode(model);
    var savedmodel = System.Web.Helpers.Json.Encode(savedSearch);

    if (savedSearch == null)
    {
        model.NewSearch = true;
    }

    //The search hasn't changed.
    if(currentmodel == savedmodel) 
    {
        model.isSameSearch = true;
    }
    else
    {
        model.isSameSearch = false;
    }
    //do more stuff
    //return view
}

ビューモデルSearchViewModel

public class SearchViewModel
{

    public SearchViewModel()
    {
        Page = 1;
        BuildingSearch = new SearchBuildingViewModel();
        ParcelSearch = new SearchParcelViewModel();
        SalesSearch = new SearchSalesViewModel();
        PropertyFeatureSearch = new SearchPropertyFeaturesViewModel();
        ValuesSearch = new SearchValuesViewModel();
    } 

    /// <summary>
    /// Gets or sets a value indicating whether use advanced search.
    /// </summary>
    public bool UseAdvancedSearch { get; set; }
    public bool NewSearch { get; set; }
    public bool isSameSearch { get; set; }
    /// <summary>
    /// Gets or sets the page.
    /// </summary>
    [HiddenInput]
    [ScaffoldColumn(false)]
    public int Page { get; set; }

    [HiddenInput]
    [ScaffoldColumn(false)]
    public string SortOption { get; set; }

    #region Search View Models

    /// <summary>
    /// Gets or sets the building search.
    /// </summary>
    public SearchBuildingViewModel BuildingSearch { get; set; }

    /// <summary>
    /// Gets or sets the parcel search.
    /// </summary>
    public SearchParcelViewModel ParcelSearch { get; set; }

    /// <summary>
    /// Gets or sets the property feature search.
    /// </summary>
    public SearchPropertyFeaturesViewModel PropertyFeatureSearch { get; set; }

    /// <summary>
    /// Gets or sets the sales search.
    /// </summary>
    public SearchSalesViewModel SalesSearch { get; set; }

    /// <summary>
    /// Gets or sets the values search.
    /// </summary>
    public SearchValuesViewModel ValuesSearch { get; set; }

    #endregion

    /// <summary>
    /// Gets or sets the search results.
    /// </summary>
    [ScaffoldColumn(false)]
    public IPagination<ParcelResultItemViewModel> SearchResults { get; set; }
}
4

2 に答える 2

3

T が ViewModel クラス名である ViewModel に実装IEquatable<T>し、独自の Equals メソッド ロジックを作成します。

public bool Equals(ViewModel other)
{
    //compare properties, etc here
}

GetHashCode() をオーバーライドします。

public override int GetHashCode()
{
    //you custom hash code algorithm
}
于 2014-01-01T19:18:06.117 に答える