Я очень новичок в MVC, и я пытаюсь выяснить, есть ли лучший способ сделать это. У меня есть текстовое поле для пользователя, которое может выполнить поиск, а затем на основе этого поиска я показываю некоторые результаты ниже указанного окна поиска. Я стараюсь избегать так много логики кода на мой взгляд и хотел бы знать, есть ли лучший способ справиться с этим. Вот мой существующий код, в котором на основе того, что значение «Model.Results» является он будет возвращать один из 3-й частичного вида или кнопку, если остальная часть моей логики проходит:MVC Partial Views issue
@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>
}
}
}
Я хотел бы поставить это внутри контроллера, чтобы он просто возвращал представление, которое должно отображаться, а затем просто отображать это представление на странице. Aftering делать некоторые rearch я думал, используя Ajax.BeginForm с InsertionMode равного InsertAfter будет делать трюк:
@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>
}
Мое GenericSearch Действие затем использует переключатель решить, частичный вид вернуться:
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;
}
}
Но когда я это пробовал, он помещает частичный вид на новую страницу.
вот один из моих окон открывается частичный вид (все они в основном 3 идентичны этим)
@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>
Любая помощь будет оценен по достоинству!
Редактировать Просто полезный намек на случай, если кто-то совершит ту же самую глупую ошибку, что и я, убедитесь, что ваши связки вызываются перед вашими скриптами.
@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>
Я добавил в эти последние 2 строчки, когда было упомянуто, использовать те, но они были выше моих пучках .... и, таким образом Ajax не работает из-за него. Спасибо за помощь всем, теперь все хорошо! --Joseph
Вы можете показать свой код частичного просмотра, он должен быть сверху '' @ {Layout = null;} '', который используется для указания, не используйте для него какую-либо основную страницу –
Я просто добавил @ {Layout = ноль; } к моим частичным представлениям и, похоже, это не изменило результат. Я обновил свой пост, чтобы показать одно из моих взглядов. – jpaugh78
Вы хотите просто вернуть результаты внутри одной таблицы на странице? Является ли частичное представление, которое вы возвращаете, просто добавляя к текущим результатам? Если это так, вы хотите «InsertionMode.Replace», который просто повторно отображает div 'searchResults' –