11

最初にエンティティ フレームワーク モデルで ASP.NET MVC 4 を使用しています。

私の「Masterpage.cshtml」では、テキストボックスとボタンを含む部分ビューが必要です。

検索はアイテムのタイトルを探しています。テキストにアイテムのタイトルが含まれている場合は、それらのアイテムを表示する必要があります。

テキストが送信される@renderbody()と、アイテムを含むビューが表示されます。

私の質問は、どうすればこれを良い方法で行うことができますか? 良い簡単なアプローチは何ですか?

これまでのところ、私はこれを行ってきました:

検索機能を実行するメソッドをリポジトリに作成しました。

public List<News> Search(string query)
        {

            var queryz =  db.News.Where(x => x.Title.Contains(query));
            return queryz.ToList();
        }

今、私の Searchcontroller に関して言えば、これを行う方法を失いました。1つのアクション結果は、文字列クエリパラメーターを持つ部分ビューである必要があり、もう1つはアイテムを表示するビューを含む必要があるためですか?

私が今行ったことは、プロセス全体を同じアクション結果にすることです:

 Repository rep = new Repository();
        [HttpPost]
        public ActionResult Search(string query)
        {
            var searchlist = rep.Search(query);

            var model = new ItemViewModel()
            {
                NewsList = new List<NewsViewModel>()
            };

            foreach (var NewsItems in searchlist)
            {
                FillProductToModel(model, NewsItems);
            }

            return View(model);
        }

        private void FillProductToModel(ItemViewModel model, News news)
        {
            var productViewModel = new NewsViewModel
            {

                Description = news.Description,
                NewsId = news.Id,
                Title = news.Title,
                link = news.Link,
                Imageurl = news.Image,
                PubDate = news.Date,
            };
            model.NewsList.Add(productViewModel);
        }

どんな種類の助けも大歓迎です!

4

2 に答える 2

26

次のアプローチを使用できます。

インデックス.cshtml

検索コントローラー アクションを呼び出す 1 つの DIV と、結果を表示する別の DIV を用意します。

<div id="search-form">
    @Html.Action("Search", "Home");  // GET action in controller that displays form
</div>
<div id="search-results">
</div>

_SearchFormPartial.cshtml

検索フォームを含む部分ビューを作成します。Ajax.BeginFormユーザーが検索すると、結果がsearch-resultsAJAX によって Index.cshtml の DIV に表示されるように使用できます。UpdateTargetId検索結果をsearch-resultsDIV に渡すことを指定します。

@using (Ajax.BeginForm("Search", "Home", FormMethod.Post,
        new AjaxOptions
        {
            InsertionMode = InsertionMode.Replace,
            HttpMethod = "POST",
            UpdateTargetId = "search-results"
         }))
{
<div>
    @Html.TextBox("query")
    <input type="submit" value="Search" />
</div>      
}

コントローラ

コントローラーでは、フォームを表示するアクション (上記の部分ビュー) と、検索クエリを処理して結果を表示する別の部分ビューを返すアクションが必要です。

[HttpGet]
public ActionResult Search()
{
    return PartialView("_SearchFormPartial");
}

[HttpPost]
public ActionResult Search(string query)
{
    if(query != null)
    {
        try
        {
            var searchlist = rep.Search(query);

            var model = new ItemViewModel()
            {
                NewsList = new List<NewsViewModel>()
            };

            return PartialView("_SearchResultsPartial", model);
        }
        catch (Exception e)
        {
            // handle exception
        }
    }
    return PartialView("Error");
}

_SearchResultsPartial.cshtml

このパーシャルは結果を表示します。を取り込んで強く型付けされていItemViewModelます。

@model Namespace.ViewModels.ItemViewModel
@if (Model.SearchResults.Count == 0)
{
    <h3 class="text-error">No items matched your search query!</h3>
}
else
{
    foreach (var result in Model.NewsList)
    {
        // display search results
    }
}
于 2013-05-19T20:38:30.067 に答える