Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NET MVC中从Ajax帖子返回状态和HTML_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 在ASP.NET MVC中从Ajax帖子返回状态和HTML

Asp.net mvc 在ASP.NET MVC中从Ajax帖子返回状态和HTML,asp.net-mvc,Asp.net Mvc,我正在呈现一个页面,其中页面的一部分是表单——通过部分。表单上的submit按钮通过Ajax(使用JQuery.post())发布到我的控制器。当控制器操作接管时,有两种可能的执行路径: 表单数据是有效的。在这种情况下,控制器使用新记录更新数据库,然后通过呈现PartialView(并返回ViewResult)返回HTML表 表单数据无效。在本例中,我希望重新呈现原始表单——突出显示验证失败。我相信我可以用不同的PartialView调用来实现这一点 在客户端,在completionjavasc

我正在呈现一个页面,其中页面的一部分是表单——通过部分。表单上的submit按钮通过Ajax(使用JQuery.post())发布到我的控制器。当控制器操作接管时,有两种可能的执行路径:

  • 表单数据是有效的。在这种情况下,控制器使用新记录更新数据库,然后通过呈现PartialView(并返回ViewResult)返回HTML表

  • 表单数据无效。在本例中,我希望重新呈现原始表单——突出显示验证失败。我相信我可以用不同的PartialView调用来实现这一点

  • 在客户端,在completionjavascript函数中,我必须区分成功和失败的情况,因为返回HTML的DOM目标是不同的。我想我可以检查HTML中的一些已知元素来区分这些情况,但在我看来,更好的解决方案是返回一个JSonResult,该JSonResult在一个字段中包含布尔状态,在另一个字段中包含HTML

    我知道如何从控制器返回JsonResult。但是,我需要能够从PartialView调用中捕获HTML,以便将文本粘贴到字段中。有谁知道:

    (a) 如何做到这一点,和/或

    (b) 一个更好的方法来处理这种情况

    短暂性脑缺血发作

    2009年8月20日更新

    我想我已经接近我想要的代码了:

            ViewEngineResult viewEngineResult = ViewEngines.Engines.FindPartialView(this.ControllerContext, "HospitalDoseList");
            ViewData.Model = hospitalStay;
            ViewContext viewContext = new ViewContext(ControllerContext, viewEngineResult.View, this.ViewData, this.TempData);
            using (StringWriter writer = new StringWriter()) {
                viewEngineResult.View.Render(viewContext, writer);
                string html = writer.ToString();
                JsonResult jsonResult = new JsonResult();
                jsonResult.Data = new {Status = true, Html = HttpUtility.HtmlEncode(html)};
                return jsonResult;
            }
    
    然而,html字符串是空的,我希望它包含通常通过调用来呈现给响应流的html

    return PartialView("HospitalDoseList", hospitalStay);
    

    我建议最简单的方法是通过提交按钮触发单独的验证和post操作。首先要执行一个AJAX验证/post,返回JSON状态和可能的验证错误(字符串)数组。实际上,一个空的列表可能足以作为成功的证据,因此您可能会忽略状态。完成服务器端验证后,通过AJAX调用另一个操作来检索要显示的数据。此操作将呈现部分视图并返回HTML。

    我本来打算将其粘贴在注释中,但文本太多了

    返回AJAX状态代码的模式非常常见,请查看我在这里的文章:以及这篇博客文章:


    至于部分视图,您有点运气不好-ViewResults需要调用ExecuteResult(),然后直接将html呈现给响应。你需要想出一个不同的策略,也许像tvanfosson所建议的那样。

    我同意你的想法,返回json结果时使用HTML和状态,但是如果你想要的不仅仅是成功/失败的状态,那么最好将状态设置为某种枚举,而不是布尔值。这是有道理的。我不知道如何从PartialView调用中获取HTML字符串。对不起,我不熟悉MVC,但是这个链接可能会帮助您。好吧,在我发布代码片段后,我发现这篇文章指出IView.Render的TextWriter参数被忽略了?!这是一个有趣的想法。但是,我想利用视图中的Html.Validation扩展方法,这些方法在ViewData的ModelState中显示验证错误。我想我看到了关于IView.Render的一些内容,它允许将视图呈现为响应流以外的其他内容(例如内存流)。我会沿着这些线再挖一些…我已经挖了。。不幸的是,这不会让你走得太远。问题是PartialView.View在调用ExecuteReader()之前是空的。。然后,如果尝试对视图调用Render(),它只会返回一个空字符串,因为它已由视图引擎渲染和释放。如果你真的找到了方法,请把它贴出来。