C# MVC局部视图问题
我是MVC的新手,我正在尝试找出是否有更好的方法来做到这一点。我有一个文本框供用户在搜索中输入,然后基于该搜索,我在所述搜索框下方显示一些结果。我试图避免在我看来有这么多的代码逻辑,我想知道是否有更好的方法来处理这个问题。这是我现有的代码,根据“Model.Results”的值,如果其余逻辑通过,它将返回3个局部视图中的一个或一个按钮:C# MVC局部视图问题,c#,ajax,asp.net-mvc,asp.net-mvc-4,C#,Ajax,Asp.net Mvc,Asp.net Mvc 4,我是MVC的新手,我正在尝试找出是否有更好的方法来做到这一点。我有一个文本框供用户在搜索中输入,然后基于该搜索,我在所述搜索框下方显示一些结果。我试图避免在我看来有这么多的代码逻辑,我想知道是否有更好的方法来处理这个问题。这是我现有的代码,根据“Model.Results”的值,如果其余逻辑通过,它将返回3个局部视图中的一个或一个按钮: @section CustomerPrefixInfo { @if (Model.Results == PrefixSearch.SearchResul
@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>
}
}
}
但当我尝试这一点时,它将部分视图放到了一个新页面上
这是我的一个局部视图(它们都是3个基本相同的视图)
@model MVC\u Test\u Project.Models.PrefixSearch
@{
ViewBag.Title=“PrefixResults”;
}
@{
布局=空;
}
@Html.DisplayNameFor(model=>model.PrefixResults[0].Prefix)
@DisplayNameFor(model=>model.PrefixResults[0].CustomerCount)
@DisplayNameFor(model=>model.PrefixResults[0].Link)
@foreach(Model.PrefixResults中的变量项)
{
@DisplayFor(modelItem=>item.Prefix)
@DisplayFor(modelItem=>item.CustomerCount)
}
任何帮助都将不胜感激
编辑这只是一个有用的提示,如果有人犯了我犯过的同样愚蠢的错误,请确保在脚本之前调用您的包
@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>
@Styles.Render(“~/Content/css”)
@Scripts.Render(“~/bundles/modernizer”)
@Scripts.Render(“~/bundles/jquery”)
@Scripts.Render(“~/bundles/jqueryval”)
@Scripts.Render(“~/bundles/bootstrap”)
当提到要使用这些代码时,我已经添加了最后两行代码,但是它们在我的包之上……因此ajax无法工作。谢谢大家的帮助,一切都好了!
--Joseph确保在要执行ajax的页面顶部包含jQuery和
jQuery.unobtrusive ajax.js
(或jQuery.unobtrusive ajax.min.js
)
像这样:
<script src="~/scripts/jquery-1.x.x.js" />
<script src="~/scripts/jquery.unobtrusive-ajax.js" />
...
The rest of your page down here
...
然后Ajax将返回部分视图,并将内容放入searchResults
div中
编辑2
我注意到在您的Ajax.BeginForm
的AjaxOptions
对象中缺少HttpMethod=“POST”
AjaxOptions
应该如下所示:
new AjaxOptions {
HttpMethod = "POST",
UpdateTargetId = "searchResults",
InsertionMode = InsertionMode.Replace
}
我想把它放在一个控制器中,这样它就可以返回视图
看起来很直截了当:
视图模型:
public class MyModel
{
public string PageToRender { get; set; }
}
控制器动作
public ActionResult DoLogic()
{
//var Results = ?? as The ENum
switch(Results)
{
PrefixSearch.SearchResults.CustomerFound:
model.PageToRender = "_CustomerPrefixInfo";
// etc etc
}
return View(model);
}
视图:
虽然我可能会装饰枚举:
public enum SearchResults
{
[Display(Name="_CustomerPrefixInfo")]
CustomerFound
}
然后没有switch语句,你只是。你能显示你的部分视图代码吗,它应该在顶部有一个
@{Layout=null;}
用来告诉你,不要使用itI的任何母版页。我只是将@{Layout=null;}添加到我的部分视图中,结果似乎没有改变。我更新了我的帖子以显示我的一个视图。您是否希望只在页面上的一个表中返回结果?返回的局部视图是否只是当前结果的附加部分?如果是这种情况,您需要InsertionMode.Replace
,它只会重新呈现搜索结果
div确保控制器中的操作方法上方有[HttpPost]
属性。另外,如果您只是“搜索”结果,而不是实际“发布”任何内容,我建议您使用GET
请求(操作方法上方不需要属性),并将FormMethod
更改为GET
,或者尝试将AjaxOptions
中的HttpMethod
设置为“GET”
@jpaugh78为什么要使用ajax来实现这一点。它似乎不能解决你的具体问题。这是一项很酷的技术,我经常做你想做的事情,但对于你的特殊需求来说,这似乎有些过头了。这并没有回答如何切换逻辑的问题。不管html是如何呈现的,他仍然希望视图中没有逻辑。如果你正确阅读了文章,他在动作代码中加入了逻辑,这决定了返回哪个部分视图……我编辑了我的答案,以澄清逻辑可以在哪里,以及如何在返回部分视图的页面上显示这一点。很高兴听到您有所进展:)在您使用的AjaxOptions对象属性中,我总是使用一个东西没有;这就是HttpMethod=“POST”
。尝试添加此项,并让我知道您的进展情况-不要将其与现有的FormMethod.Post
混淆;你可以把它留在…不可能!容易犯错误。不管是谁,为了清楚起见,我在编辑我的答案时对我最后的评论进行了扩展。祝你好运!:)我解释了我的反对票。我认为我的回答似乎是虚伪的。我已经编辑了我的回答,包括逻辑可以在哪里——他已经提到,他已经把逻辑放在控制器中;所以我认为这就是他前进的方向,我需要知道如何将结果解析为页面上的div-如果你有点生气,请原谅
<div id="searchResults"></div>
new AjaxOptions {
HttpMethod = "POST",
UpdateTargetId = "searchResults",
InsertionMode = InsertionMode.Replace
}
public class MyModel
{
public string PageToRender { get; set; }
}
public ActionResult DoLogic()
{
//var Results = ?? as The ENum
switch(Results)
{
PrefixSearch.SearchResults.CustomerFound:
model.PageToRender = "_CustomerPrefixInfo";
// etc etc
}
return View(model);
}
@{if (!string.IsNullOrEmpty(model.PageToRender))
Html.RenderPartial(model.PageToRender);}
public enum SearchResults
{
[Display(Name="_CustomerPrefixInfo")]
CustomerFound
}