简体   繁体   English

返回局部视图或视图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM