[英]Returning either a Partial View or a View
From my Home page i have a search textbox that when search is clicked calls an ajax search function which calls my controller. 在我的主页上,我有一个搜索文本框,单击该搜索框会调用ajax搜索功能,该功能会调用我的控制器。 Based on the searchString that is passed I want to either replace a div with a gridview (this part is working) or have it load a new page.
基于传递的searchString,我想用gridview替换div(此部分正在工作)或加载新页面。 Instead it is loading the new view in the same div that the partial views are replacing.
相反,它将在要替换部分视图的同一div中加载新视图。 How can I do this?
我怎样才能做到这一点? Ill post my code below.
请在下面张贴我的代码。 All my data is coming back correctly and everything else is working just fine.
我的所有数据都能正确返回,其他所有功能都可以正常工作。
<script>
$(function () {
$('.search').click(function () {
var $buttonClicked = $(this);
var searchString = $("#searchStringTextBox").val();
$.ajax({
url: '@Url.Action("ShowGrids")',
type: 'GET',
data: { searchString: searchString },
modal: true,
success: function (partialView) {
$('#gridViews').html(partialView);
$('#gridViews').show();
}
});
});
});
</script>
controller 控制者
public ActionResult ShowGrids(string searchString)
{
if (IsValidPersonIdFormat(searchString))
{
var id = searchString.Substring(1);
id = id.Replace("-", "");
var x = Convert.ToInt64(id);
var model = cs.GetById(x);
TempData["model"] = model;
return Redirect(Url.Action("ShowPersonDetails", "Data"));
}
else if(IsValidIdFormat(searchString))
{
var id = searchString.Substring(1);
id = id.Replace("-", "");
var model = ps.GetById(Convert.ToInt64(id));
return View("Details", model);
}
else if (IsValidServiceIdFormat(searchString))
{
var id = searchString.Substring(1);
id = id.Replace("-", "");
var model = vss.GetById(Convert.ToInt64(id));
return PartialView("ServiceDetails", model);
}
}
public ActionResult ShowPersonDetails()
{
var model = TempData["model"];
return View("PersonDetails", model);
}
This has every way I tried to get it to work. 这是我尝试使其工作的所有方法。 Just figured I would show what I was trying and it not working.
只是想出了我会显示我正在尝试的方法,但是它没有用。
The if
on server-side is not affecting what the javascript does on success: it's stuffing the results of the call into a div. 服务器端的
if
不会影响javascript成功执行的操作:它将调用结果填充到div中。
If that's not what you want to do, you need to test for the results in javascript and do something else if what you got is not a partial view. 如果这不是您想要执行的操作,那么您需要在javascript中测试结果,如果得到的不是局部视图,则需要执行其他操作。
确保每次使用jQuery调用动作时,如果要重定向,动作都会将HTML字符串返回到jQuery,而不是从动作返回一些json字符串到jQuery调用并从那里重定向页面
You can do something like this. 你可以做这样的事情。 This is not fully tested.
尚未完全测试。
public JsonResult ShowGrids(string searchString)
{
if (IsValidPersonIdFormat(searchString))
{
var id = searchString.Substring(1);
id = id.Replace("-", "");
var x = Convert.ToInt64(id);
var model = cs.GetById(x);
TempData["model"] = model;
return Json(new { IsRedirect = true, RedirectUrl = Url.Action("ShowPersonDetails", "Data") }, JsonRequestBehavior.AllowGet);
}
else if(IsValidIdFormat(searchString))
{
var id = searchString.Substring(1);
id = id.Replace("-", "");
var model = ps.GetById(Convert.ToInt64(id));
return Json(new { IsRedirect = false, Content = RenderRazorViewToString("Details", model) }, JsonRequestBehavior.AllowGet);
}
else if (IsValidServiceIdFormat(searchString))
{
var id = searchString.Substring(1);
id = id.Replace("-", "");
var model = vss.GetById(Convert.ToInt64(id));
return Json(new { IsRedirect = false, Content = RenderRazorViewToString("ServiceDetails", model) }, JsonRequestBehavior.AllowGet);
}
}
<script>
$(function () {
$('.search').click(function () {
var $buttonClicked = $(this);
var searchString = $("#searchStringTextBox").val();
$.ajax({
url: '@Url.Action("ShowGrids")',
type: 'GET',
data: { searchString: searchString },
modal: true,
success: function (data) {
if(data.IsRedirect){
window.location.href = data.RedirectUrl;
}
else{
$('#gridViews').html(data.Content);
$('#gridViews').show();
}
}
});
});
});
</script>
Code for rendering view to string: 用于将视图呈现为字符串的代码:
public string RenderRazorViewToString(string viewName, object model)
{
ViewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext,
viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View,
ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.