返回部分视图或视图

时间:2015-04-21 19:41:34

标签: c# asp.net ajax asp.net-mvc

在我的主页上,我有一个搜索文本框,当点击搜索时,调用一个调用我的控制器的ajax搜索功能。基于传递的searchString,我想要用gridview替换div(这部分正在工作)或者让它加载一个新页面。相反,它将在部分视图替换的同一div中加载新视图。我怎样才能做到这一点?我发布下面的代码。 我的所有数据都正确回归,其他一切工作正常。

<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>

控制器

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);
    }

我有办法让它发挥作用。只是想到我会展示我正在尝试的东西而且它不起作用。

3 个答案:

答案 0 :(得分:2)

服务器端的if不影响javascript在成功时所做的事情:它将调用结果填入div。

如果那不是你想要做的,你需要在javascript中测试结果,如果你得到的不是局部视图,还要做其他事情。

答案 1 :(得分:1)

确保当你使用jQuery调用action时,action会将HTML字符串返回到jQuery中,如果你想重定向而不是从你的动作返回一些json字符串到jQuery调用并从那里重定向页面

答案 2 :(得分:1)

你可以这样做。这尚未经过全面测试。

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>

将视图呈现为字符串的代码:

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();
  }
}