2017-04-11 16 views
1

ViewResultでビューを作成し、ビューには検索文字列とサブミットするボタンを入力するテキストボックスがあります。それは素晴らしい作品、私の検索したアイテムを返し、画面に表示されます。今、私の要件は、そのテキストボックスをホームレイアウト(下)に移動し、そこから提出することです。しかし、私がサブミットを押して、それがajaxポストを呼び出すと、デバッグはviewResultを検索する検索文字列を表示し、関連するビューにも到達しますが、ビューはレンダリングされません。何か案は?ここでMVCのajax.postからビューレンダリングが呼び出されない理由

はここで検索ボックス

<div style="float:right;"> 
       <input type="text" id="searchString" name="searchString" /> 
       <a href="#" id="search" ><img src="~/Images/Custom/searchIcon.jpg" style="width:25px; height:25px;"/></a> 
      </div> 

であるAjaxのポストではJavaScript

<script> 
    $(document).ready(function() { 

     $("#search").click(function() { 
      var searchString = $("#searchString").val(); 
      var datastring = { "searchString": searchString }; 

      $.ajax({ 

       url: "/Home/Search/", 
       type: "POST", 
       contentType: "application/json", 
       data: JSON.stringify(datastring), 
       datatype: 'json', 
       success: function() { 
        console.log('success!!'); 
       } 

      }); 
     }); 
    }); 
</script> 

、ここでは私のするViewResultです:

public ViewResult Search(string searchString, int? pageNumber) 
    { 
     // var searchString = fc["searchString"]; 
     var results = new ArrayList(); 
     var mylist = new List<SearchResult>(); 
     var model = new SearchViewModel(); 
     var host = "/CommunityWildlifeHabitat"; 
     if (System.Web.HttpContext.Current.Request.IsLocal) 
      host = ""; 


      // Search Communities 
      var search = from s in db.Communities 
         where s.ComunityName.Contains(searchString) || s.Description.Contains(searchString) 
         select s; 

      // Search Resource Center 
      var docs = from d in db.ResourceCenters 
         where d.Title.Contains(searchString) || d.Description.Contains(searchString) 
         select d; 

     // Set up Arraylist with type Community 
     foreach(var c in search) 
     { 
      var community = new SearchResult(); 
      community.type = "community"; 
      community.CommunityId = c.CommunityId; 
      community.CommunityName = c.ComunityName; 
      community.Description = c.Description; 
      community.CommunityType = c.CommunityType1.TypeName; 
      community.CommunityCity = c.CommunityCity; 
      community.CommunityState = c.CommunityState; 
      community.CommunityZip = c.CommunityZip; 
      community.Population = c.Population; 
      mylist.Add(community); 
     } 

     // Set up ArrayList with type ResourceCenter 
     foreach (var d in docs) 
     { 
      var document = new SearchResult(); 
      document.type = "document"; 
      document.Title = d.Title; 
      document.Document_Description = d.Description; 
      document.FilePath = d.FilePath; 
      document.Date = Convert.ToDateTime(d.Date); 
      document.UpLoadedBy = d.UpLoadedBy; 
      mylist.Add(document); 
     } 

     model.results = mylist; 
     ViewBag.results = model.results; 
     ViewBag.searchString = searchString; 
     ViewBag.Host = host; 

     return View(mylist.ToPagedList(pageNumber ?? 1, 10)); 
    } 

最後に、ここに私がいます表示:

<h2>Search</h2> 

@using (Html.BeginForm("Search", "Home", FormMethod.Get, new { @class = "form-horizontal", role = "form" })) 
{ 
    @Html.TextBox("searchString", ViewBag.searchString as string, new { @class = "form-control", required = "required"}) 
    <input type="submit" class="btn btn-default" value="Search" /> 
    <hr /> 



    if (@Model.Count != 0) 
    { 
     <h3>The following results were found for @ViewBag.searchString</h3> 


     foreach (var search in @Model) 
     { 

      if (@search.type == "community") 
      { 
       <div class="resource-element"> 
        <a href="@ViewBag.Host/Communities/CommunityPage/@search.CommunityId"> 
         <span class="resource-type pull-right">Community</span> 
        </a> 
        <a href="@ViewBag.Host/Communities/CommunityPage/@search.CommunityId"><h3>@search.CommunityName</h3></a> 
        <p>@search.Description</p> 
        <span class="">Type : @search.CommunityType</span><br /> 
        <span class="">@search.CommunityCity, @search.CommunityState @search.CommunityZip</span><br /> 
        <span class="">Population: @search.Population</span> 
        <br> 
       </div> 
      } 
      else 
      { 


       <div class="resource-element"> 
        <a href="@[email protected]"> 
         <span class="resource-type pull-right">Document</span> 
        </a> 
        <a href="@[email protected]"><h3>@search.Title</h3></a> 
        <p>@search.Document_Description</p> 
        <span class="">@search.Date</span> 
        <br> 
        <span class="">@search.UpLoadedBy</span> 
        <br> 
       </div> 
      } 

     } 

     @Html.PagedListPager(Model, pageNumber => Url.Action("Search", "Home", new { searchString = @ViewBag.searchString, pageNumber }), 
      new PagedListRenderOptions() { Display = PagedListDisplayMode.IfNeeded, DisplayPageCountAndCurrentLocation = true }) 

    } 
    else 
    { 
     if (@ViewBag.searchString != null) 
     { 
      <div class="resource-element"> 
       <a href="#"> 
        <span class="resource-type pull-right"></span> 
       </a> 
       <h3>No Results Found</h3> 
      </div> 
     } 

    } 


} 
+0

レンダリングを手動でトリガーする必要があると思います。だから、 'success:function(){console.log( 'success !!');ビューをレンダリングできるjs関数を使用します。あなたのIDEにそのような機能がない場合は、手動でDOMに挿入する必要があります。 – Shilly

+0

ええ、私はそれを考えました。ありがとう –

+0

これをC#mvcまたはASP mvcとしてタグ付けすると(これはC#ですが、100%はわかりません)、そこから回答が得られるかもしれません。 – Shilly

答えて

1

あなたは、単に以下の

@using (Html.BeginForm("Search", "Home", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
{ 

でフォームヘルパーを変更し、あなたのjqueryのを削除した場合、それがサーバーに正しくフォームを投稿すると、自動的にページをリロードする必要があります。

ページ内で非同期呼び出しを実行する必要は特にありません。

+0

これは素晴らしい作品です!本当にありがとう –

関連する問題