2015-08-31 3 views
2

Я использую MVC5, и я хочу, чтобы найти результат и остаться на той же странице, вот мой метод в мой контроллер (LiaisonsProjetsPPController), что делать операцию поиска:поиск MVC оставаться той же странице

public ActionResult IndexAjoutML(int id, string SearchString) 
    { 
     PartiesPrenantesEntities db = new PartiesPrenantesEntities(); 
     ViewBag.idProjet = id; 
     ViewBag.searchString = SearchString; 

     IQueryable<ActivitesPP> qry = this.db.ActivitesPP.Intersect(from item in this.db.LiaisonsProjetsPP where item.idProjet == id select item.ActivitesPP).Include(model => model.Activites.CatActivites);    
     var act = from s in db.CatActivites 
        select s; 

     if (!String.IsNullOrEmpty(SearchString))      
      return PartialView("~/Views/ActivitesPP/IndexAjoutProjet.cshtml", this.db.ActivitesPP.Where(s => s.PartiesPrenantes.nomPP.Contains(SearchString)).Except(qry));     
     else 
      return PartialView("~/Views/ActivitesPP/IndexAjoutProjet.cshtml", this.db.ActivitesPP.Except(qry)); 
    } 

Тогда на мой взгляд (Просмотров/ActivitesPP/IndexAjoutProjet) у меня есть формы поиска и DIV результата отображения:

@using (Ajax.BeginForm("IndexAjoutML", "LiaisonsProjetsPP", FormMethod.Post, 
     new AjaxOptions 
     { 
      InsertionMode = InsertionMode.Replace, 
      HttpMethod = "POST", 
      UpdateTargetId = "search-results" 
     }, new { @id = "searchFormPP" })) 
{ 
      <p> 
       <label>Partie prenante: </label> @Html.TextBox("SearchString") 
       <input id="inputRecherche" name="SearchString" type="submit" value="Rechercher" /> 
      </p> 
    } 


<div id="search-results"> 

@{foreach (var catactivite in Model.GroupBy(model => model.Activites.CatActivites)) 
     { 
String couleurCategorie = catactivite.Key.couleurCategorie; 
String couleurTexte = CustomHelpers.GetForegroundColor(couleurCategorie); 
      //Image de la partie prenante 

      <div class="panel-heading unhide" style="background-image: none; color: @couleurTexte; background-color: @couleurCategorie; padding: 2px;"> 

      </div> 

      foreach (var pp in catactivite) 
      { 
       String nomPP = (pp.idPP == null ? "Inconnu" : pp.PartiesPrenantes.nomPP); 
       String dateAffichee; 
       String imgPP = "../../Images/Profils/" + (pp.PartiesPrenantes.imgPP ?? "avatar.png"); 
       if (pp.finActivite == null) 
       { 
        dateAffichee = "Depuis le " + String.Format("{0:d/MM/yyyy}", pp.debutActivite); 
       } 
       else 
       { 
        dateAffichee = "Depuis le " + String.Format("{0:d/MM/yyyy}", pp.debutActivite) + ", jusqu'au " + String.Format("{0:d/MM/yyyy}", pp.finActivite); 
       } 
       <div class="panel panel-primary"> 
        <div class="panel-heading unhide" style="color: @couleurTexte; background-color: @couleurCategorie;"> 
         <div style="float: left"> 
          <img class="imgPP img-circle" src="@(imgPP)" /> 
         </div> 
         <h5>@pp.Activites.libelleActivite (@Html.Raw(pp.idLieu == 999 ? "National" : pp.Lieux.nomLieu))</h5> 
         <h6>@pp.PartiesPrenantes.nomPP</h6> 
        </div> 
        <div class="panel-body hiddenPart"> 
         @if (pp.idPP != null) 
         { 
          <label>Commentaire</label> 
          <p>@(pp.commentaireActivite ?? "Pas plus de détails..")</p> 
          @Html.Action("CreateForm", "LiaisonsProjetsPP", new { idActivite = pp.idActivite, idProjet = ViewBag.idProjet }) 
         } 
        </div> 
       </div> 
      }     
     } 
    } 
</div> 
} 
else 
{ 
    @Html.Raw("<p>Aucune partie prenante disponible..") 
    @Html.Raw("(attention: pour être ajoutée, une partie prenante doit posséder au moins une activité référencée..)</p>") 
    } 

на мой взгляд, я называю свой метод поиска (Просмотров/Projets/Детали): @{ Html.RenderAction("IndexAjoutML", "LiaisonsProjetsPP", new { idProjet = Model.idProjet, searchString = Model.searchString }); }

Поиск работы, но он перенаправляет меня на другую страницу http://localhost:49612/LiaisonsProjetsPP/IndexAjout/1 вместо того, чтобы оставаться на этой странице http://localhost:49612/Projets/Details/1.

ответ

1

Что вы пытаетесь сделать, кажется, загружает результаты ненавязчиво с формой AJAX. Professional ASP.NET MVC 5 книга Джона Галлоуэя и др. имеет хороший раздел об этом, но, понимая, что никто не читает книги, я предоставил ссылку на сайт с образцом кода для него. Сайт .NET Funda описывает here точно, как искать и возвращать результаты на ту же страницу без полного обновления, используя ненавязчивый-ajax. Вероятно, что вам не хватает, это ссылка на jquery.unobtrusive-ajax.min.js. Другие posts на Stack Overflow также ссылаются на эту тему, но я понимаю, что вы можете не знать правильные условия поиска. Попытайтесь более подробно изучить «ненавязчивую загрузку AJAX» в качестве поисковых терминов для дальнейших исследований.

Этот пример из книги, которую я упомянул от Джона Галлоуэя. Сообщение об ошибке JavaScript.

function searchFailed(){ 
 
    $("#searchresults").html("Sorry, there was a problem searching."); 
 
    } 
 

 
This is what a simple Ajax form should look like. Note the "GET" form method.
<div class="panel panel-default"> 
 
    <div class="panel-heading"> 
 
    Artist Search 
 
    </div> 
 
    <div class="panel-body"> 
 
    @using(Ajax.BeginForm("ArtistSearch", "Home", 
 
    new AjaxOptions 
 
    { 
 
     InsertionMode = InsertionMode.Replace, 
 
     HttpMethod = "GET", 
 
     OnFailure = "searchFailed", 
 
     LoadingElementID = "ajax-loader", 
 
     UpdateTargetId = "searchresults", 
 
    })) 
 
    { 
 
     <input type="text" name="q" /> 
 
     <input type="submit" value="search" /> 
 
     <img id="ajax-loader" 
 
      src="@Url.Content("~/Images/ajax-loader.gif")" 
 
      style="display:none" /> 
 
    } 
 
    <div id="searchresults"></div> 
 
    </div> 
 
</div> 
 
Этот метод отвечает за возврат частичный вид:

public ActionResult ArtistSearch(string q) 
{ 
    var artists = GetArtists(q); 
    return PartialView(artists); 
} 

Это метод поиска.

public List<Artist> GetArtists(string searchString) 
{ 
    return storeDB.Artist.Where(a => a.Name.Contains(searchString)).ToList(); 
} 

Обратите внимание, что метод возврата частичного представления просто «возвращает PartialView (model)»;

+0

Я добавлю это в свой код , но он все еще не работает – spykeez

+0

Установили ли вы пакет jQuery Unobtrusive, чтобы у вас был файл? Вы можете получить его через NuGet здесь: https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Ajax/ Также убедитесь, что он указан по указанному вами пути. Вы используете комплектацию? –

+0

yes Я загрузил последнюю версию jQuery Ненавязчивый и добавил ее в bundleConfig: bundles.Add (новый ScriptBundle ("~/bundles/jqueryval"). Включить ( "~/Scripts/jquery.unobtrusive *", "~/Сценарии/jquery.validate * ")); – spykeez

Смежные вопросы