【发布时间】:2016-05-11 19:19:19
【问题描述】:
我对 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 Action 使用一个开关来决定返回哪个局部视图:
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>
当提到使用它们时,我在最后两行中添加了它们,但它们在我的捆绑包之上......因此,ajax 无法正常工作。感谢大家的帮助,现在一切都好! --约瑟夫
【问题讨论】:
-
你能显示你的部分视图代码吗,它应该在顶部有
@{ Layout=null;}用来告诉它,不要使用任何母版页 -
我刚刚添加了@{ Layout=null; } 到我的部分观点,它似乎并没有改变结果。我更新了我的帖子以显示我的观点之一。
-
您是否只想在页面上的一个表格中返回结果?您返回的部分视图是否只是附加到当前结果?如果是这种情况,您需要
InsertionMode.Replace,它只是重新渲染searchResultsdiv -
确保您在控制器中的 Action 方法上方具有
[HttpPost]属性。此外,如果您只是“搜索”结果,而不是实际“发布”任何内容,我会推荐一个GET请求(不需要 Action 方法上方的属性),并将FormMethod更改为Get,或尝试将AjaxOptions中的HttpMethod设置为"GET" -
@jpaugh78 为什么要使用 ajax。它似乎无法解决您的具体问题。这是一项很酷的技术,我会做你经常尝试做的事情,但对于你的特定需求来说,这似乎是矫枉过正。
标签: c# ajax asp.net-mvc asp.net-mvc-4