我对MVC非常陌生,正在尝试找出更好的方法。我有一个文本框供用户输入搜索内容,然后根据该搜索结果显示一些结果在搜索框下面。我试图避免在视图中编写太多代码逻辑,并想知道是否有更好的处理方式。这是我的现有代码,根据"Model.Results"的值,它将返回3个部分视图之一或一个按钮(如果其余逻辑通过):
@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>
}
}
}
我希望将这段代码放入控制器中,以便它只返回要显示的视图,然后在页面上显示该视图。经过一些研究,我认为可以使用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 操作会使用 switch 语句来决定返回哪个局部视图:
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;
}
}
但是当我尝试这样做时,它会将部分视图放在一个新页面上。
这是我的其中一个部分视图(它们都与此基本相同)。
@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
[HttpPost]
属性。此外,如果您只是“搜索”结果,而不是实际“发布”任何内容,则建议使用GET
请求(无需在Action方法上方添加属性),并将FormMethod
更改为Get
,或尝试在AjaxOptions
中设置HttpMethod
为"GET"
。 - Geoff James