I am very new to MVC and I am trying to figure out if there is a better way to do this. I have a text box for a user that can perform a search, and then based on this search, I show some results below the specified search box. I try to avoid so much code logic in my opinion and would like to know if there is a better way to handle this. Here is my existing code where, based on the value of "Model.Results", it will return one of 3 partial views or a button if the rest of my logic passes:
@section CustomerPrefixInfo { @if (Model.Results == PrefixSearch.SearchResults.CustomerFound) { @Html.Partial("_CustomerPrefixInfo") } @if (Model.Results == PrefixSearch.SearchResults.PrefixResultsFound) { @Html.Partial("_PrefixResults") } @if (Model.Results == PrefixSearch.SearchResults.AnimalsFound) { @Html.Partial("_AnimalSearchResults") } @if (Model.Results == PrefixSearch.SearchResults.ValidNewPrefix) { using (Html.BeginForm("Index", "PrefixManagement", new { prefix = Model.AnimalPrefix.Prefix, dbPrefix = Model.AnimalPrefix.DbPrefix })) { <fieldset> <input id="btnReservePrefix" type="submit" value="Reserve Prefix" /> </fieldset> } } }
I would like to put this inside the controller so that it simply returns the view that should be displayed, and then just display that view on the page. After I made a few hooks, I thought of using Ajax.BeginForm with the InsertionMode setting so that InsertAfter would do the trick:
@using (Ajax.BeginForm("GenericSearch", "Home", FormMethod.Post, new AjaxOptions { InsertionMode = InsertionMode.InsertAfter, UpdateTargetId = "searchResults" })) { <fieldset> <input id="btnPrefixSearch" type="submit" value="Prefix Search/Validate"/> @Html.EditorFor(model => model.Input) </fieldset> <div id="searchResults"> </div> }
Then My GenericSearch Action uses a switch to decide which partial view returns:
public ActionResult GenericSearch(PrefixSearch prefixSearch) { //some database logic here to get the results switch (prefixSearch.Results) { case PrefixSearch.SearchResults.CustomerFound: return PartialView("_CustomerPrefixInfo", prefixSearch); case PrefixSearch.SearchResults.PrefixResultsFound: return PartialView("_PrefixResults", prefixSearch); case PrefixSearch.SearchResults.AnimalsFound: return PartialView("_AnimalSearchResults", prefixSearch); default: return null; } }
But when I tried it, it places a partial view on a new page.
here is one of my partial views (they are all basically identical to this)
@model MVC_Test_Project.Models.PrefixSearch @{ ViewBag.Title = "PrefixResults"; } @{ Layout = null; } <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.PrefixResults[0].Prefix) </th> <th> @Html.DisplayNameFor(model => model.PrefixResults[0].CustomerCount) </th> <th> @Html.DisplayNameFor(model => model.PrefixResults[0].Link) </th> </tr> @foreach (var item in Model.PrefixResults) { <tr> <td> @Html.DisplayFor(modelItem => item.Prefix) </td> <td> @Html.DisplayFor(modelItem => item.CustomerCount) </td> <td> <a href="@item.Link">edit</a> </td> </tr> } </table>
Any help would be appreciated!
Edit Only a useful hint, if someone makes the same stupid mistake as me, make sure your packages are called before your scripts.
@Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/jqueryval") @Scripts.Render("~/bundles/bootstrap") <script src="/Scripts/jquery.unobtrusive-ajax.js"></script> <script src="/Scripts/jquery.unobtrusive-ajax.min.js"></script>
I added to these last 2 lines when it was mentioned that they use them, but they were higher than my packages ... and therefore ajax did not work because of this. Thanks for helping everyone, now everything is fine! --Joseph