【问题标题】:Use different updatetargetid based on view根据视图使用不同的 updatetargetid
【发布时间】:2018-06-05 23:20:48
【问题描述】:

我有一个在 HTML 表格中显示项目列表的网页。列表上方是一个表单,它允许用户通过 AJAX(使用 Ajax.BeginForm)将新项目添加到列表中。当数据通过 AJAX 发布到控制器时,我将新项目添加到数据库后端并通过部分视图生成新表行,然后将其附加到现有表中。

当添加新项目的表单包含错误时,我想将表单呈现回 Web 浏览器并显示它。

所以问题来了:是否可以从控制器中指定 UpdateTargetId?目前,我从控制器返回的任何视图都插入到同一个目标中,但我想根据从控制器返回的任何视图更新不同的目标(即不同的 UpdateTargetId)。

【问题讨论】:

  • 您为什么要这样做?这不是违反关注点分离问题并为您的控制器引入更多复杂性吗?将它们分离为不同的控制器操作可能更容易,以简化相似的代码并将其重构为自己的方法。
  • 不知道如何拆分它。这是一个过程:用户在表单中输入数据。表单通过 AJAX 提交。如果表单包含错误,则必须将其呈现回显示错误的浏览器。如果它不包含错误,则需要将新行添加到表中。这是两个截然不同的视图,可能会被渲染回浏览器,这两个视图中的每一个都需要进入不同的占位符。

标签: asp.net-mvc


【解决方案1】:

我认为一种解决方法是使用 JSON 并在回调函数中检查结果。这就是它的样子:

function handleAjax(response) {

            var result = response.get_response().get_object();
            var isSuccess = result[0].isSuccess;
            if(isSuccess = "true")
            {
               $("#resultdiv").html(result[0].html);
            }
            else
            {
                $("#formdiv").html(result[0].html);
            } 

        }

在您的操作中,您可以编写如下内容:

public ActionResult SaveRecord(Entity entity)
{
   if(ModelState.IsValid(){
   return Json(new{isSuccess = true, html = PartialView("RowViewName")}); 
   }
   else
  {
     return json (new{isSuccess = false, html = PartialView("FormViewName")})
  }
}

我今天遇到了同样的问题,找不到“合法”的方法。我认为这个简单的解决方法应该可以完成它。目前代码完全未经测试。

请阅读此blog post 以获得替代解决方案。

【讨论】:

【解决方案2】:

基本上,您想要的是在发出 ajax 请求时根据特定条件返回 2 个不同的结果。不幸的是,这在 AjaxForm 的实际实现中是不可能的。您只能更新表单的单个区域。

解决此问题的一种可能的解决方法是使用表单创建局部视图以更新并从控制器返回局部视图,然后在 onSuccess 事件上使用普通的旧 javascript 在表中创建新行。

【讨论】:

    【解决方案3】:

    我认为另一个想法可以在服务器上重定向到另一个控制器/动作

    RedirectToAction(new {controller="home", action="index", id=931,variable="abc"});
    

    所以如果表单包含错误 RedirectToAction ... 甚至可能包含另一个 PartialView 可以放置在另一个 DIV 中...

    只是一个想法......

    【讨论】:

    • 不幸的是,由于视图中要更新的区域仍然是相同的,所以这不会有用。 Jerrie 需要的是根据结果更改可更新区域,据我所知这是不可能的。
    • 我们基本上需要在客户端设置一个标志来确定我们必须更新哪个 div。一种方法是 json。但是我上面的答案不能达到目的,因为 PartialView() 没有像我预期的那样返回 html 字符串。您可以编写自己的函数,将 partialView 转换为 Html 字符串并在 Jsonresult 中返回它以及成功标志。
    猜你喜欢
    • 2017-01-28
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    相关资源
    最近更新 更多