根据控制器响应动态更改视图部分

2024-02-28

我正在寻找以下场景的最佳方法建议:

  • 用户可以选择一个或多个 csv 文件进行验证(附件 1),单击“验证”按钮会执行验证代码(显示进度条,直到返回输出)。
  • 返回响应可以是成功消息,也可以是选择验证的每个文件的错误详细信息(附件 2)
  • 现在可以使用“上传”按钮将成功验证的文件上传到 Azure 存储。

Attachment 1 enter image description here

Attachment 2 enter image description here

现在,让一切异步,我的想法是视图需要为每个文件都有单独的灵活部分。

我正在使用 knockout.js 处理 MVC5 剃刀视图,我对部分视图有不错的想法,但我不确定如何解决这个问题。如果不是片面的观点,那么最好的方法是什么。


我的想法是视图需要有单独的灵活部分 对于每个文件

有点,我认为你需要的是文件的单独模型/类,以便按需运行 ajax 命令,至少我是这样理解你的解释的。

看看这个 jsfiddle,我添加了一些随机的 true/false 和字符串内容来尝试尽快模仿您的布局。为了进行测试,请尝试使用 5 个或更多文件(随机生成器在 JS 中有点挑剔)。

https://jsfiddle.net/n2ne6yLh/10/ https://jsfiddle.net/n2ne6yLh/10/

因此,本质上您监听文件输入上的更改事件。在本例中,将每个文件映射到新模型“FileModel”,然后将其推送到 observableArray 文件中。每个 FileModel 都包含它自己的单独结果、验证函数等。然后布局负责其余的工作。

您将需要查看 FormData Web API 才能使用 Javascript 中的文件进行操作。如果你的客户/用户使用的是过时的浏览器,那么有一个用于 FormData 的 shims/polyfills、jquery 等等。https://developer.mozilla.org/en-US/docs/Web/API/FormData https://developer.mozilla.org/en-US/docs/Web/API/FormData

var PageModel = function(r) {
  var self = this;
  this.Files = ko.observableArray();
  this.FileErrors = ko.computed(function() {
    return _.some(self.Files(), function(file) {
      return file.IsValid() === false;
    });
  });
  this.ClearFiles = function() {
    document.getElementById("your-files").value = "";
    self.Files([]);
  };

  var control = document.getElementById("your-files");
  control.addEventListener("change", function(event) {
    // When the control has changed, there are new files
    var i = 0,
      files = control.files,
      len = files.length;
    var form = new FormData();

    for (; i < len; i++) {
      form.append(files[i].name, files[i]);
      self.Files.push(new FileModel(files[i], files[i]));
    }
  }, false);

}

var FileModel = function(r, fileObject) {
  var self = this;
  this.FileObject = fileObject;
  this.Name = r.name;
  this.Type = r.type;
  this.Size = r.size;

  this.IsValidated = ko.observable(false);
  this.IsValid = ko.observable();
  this.ValidationErrors = ko.observable();

  this.ValidateFile = function() {
    //Do some ajax to validate file
    //console.log('Doing an ajax thing.')

    // Randomizers for validation, remove in production
    var random_boolean = Math.random() >= 0.5;
    var random_strins = Math.random().toString(36).substring(7);

    // Set vals based on returned ajax response.
    self.IsValidated(true);
    self.IsValid(random_boolean);
    self.ValidationErrors(random_strins);
  };
  this.UploadFile = function() {
    alert('uploading this file to the interwebs, yay!')
  }
}

window.model = new PageModel();
ko.applyBindings(model);
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div class="container">
  <div class="row">
    <div class="col-md-6 col-md-push-3">
      <div class="form-group">
        <div class="input-group">
          <input type="file" class="form-control" id="your-files" multiple>
          <span class="input-group-btn">
    <button class="btn btn-info" data-bind="click: ClearFiles">Clear</button>
  </span>
        </div>
      </div>
    </div>
  </div>
</div>

<div class="container-fluid">
  <div class="row">
    <div class="col-sm-6">
      <h4>Validate Files</h4>
      <!-- ko if: Files().length > 0 -->
      <table class="table table-condensed table-hover">
        <thead>
          <tr>
            <th>Name</th>
            <th>Type</th>
            <th>Size (bytes)</th>
          </tr>
        </thead>
        <tbody>
          <!-- ko foreach: Files -->
          <tr data-bind="css: IsValid() ? 'success' : ''">
            <td><span data-bind="text: Name"></span>
            </td>
            <td><span data-bind="text: Type"></span>
            </td>
            <td><span data-bind="text: Size"></span>
            </td>
            <td>
              <button class="btn btn-sm btn-success" data-bind="click: ValidateFile, visible: !IsValidated()">Validate</button>
              <button class="btn btn-sm btn-success" data-bind="click: UploadFile, visible: IsValid()">Upload</button>
            </td>
          </tr>
          <!-- /ko -->
        </tbody>
      </table>
      <!-- /ko -->
    </div>
    <div class="col-sm-6">
      <h4>File Errors</h4>
      <!-- ko if: FileErrors() -->
      <table class="table table-hovered">
        <thead>
          <tr>
            <th>Name</th>
            <th>Error Message</th>
          </tr>
        </thead>
        <tbody>
          <!-- ko foreach: Files -->
          <!-- ko if: IsValid() == false -->
          <tr>
            <td data-bind="text: Name"></td>
            <td data-bind="text: ValidationErrors"></td>
          </tr>
          <!-- /ko -->
          <!-- /ko -->
        </tbody>
      </table>
      <!-- /ko -->
    </div>
  </div>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据控制器响应动态更改视图部分 的相关文章

随机推荐

  • 在视图控制器转换中获取子视图的最终帧

    我正在 iOS 7 中的视图控制器之间实现自定义转换 特别是 我在视图控制器 A 和视图控制器 B 中具有相同的按钮 唯一的区别在于其位置 在视图控制器 B 中稍高一些 我希望在从视图控制器 A 到视图控制器 B 的转换中 A 中的按钮向上
  • 如何解码包含 \x3c 等的 Feedburner 结果

    Feed Burner 更改了他们的博客服务返回结果 它返回类似于以下内容的 JavaScript 块 文档 write x3cdiv 类 x3d x22feedburnerFeedBlock x22 id x3d x22RitterIns
  • Office.js |在 Excel 加载项中实施单点登录

    我正在使用 Office js javascript 和 React 创建 Excel 加载项 想要使用功能区按钮实现单点登录流程 用户成功登录后只想向用户显示任务窗格 我已经使用共享运行时 manifest xml 配置了加载项 我已在功
  • vb.net中如何转换日期格式?

    我收到的 xml 响应日期格式字符串是 MM dd yyyy h mm ss a 但我需要转换其他日期格式 dd MMM yy HH mm vb net中如何转换日期格式 请给我任何建议 假设您想将 xml 字符串值转换为正确的值DateT
  • 每次按下菜单按钮时都会双重回调 onMenuOpened/onPanelClosed

    在我的 Android 应用程序中 我想收集有关何时 多久 打开和关闭溢出 三个点 操作栏菜单 未选择项目 的统计信息 对于这个任务我已经覆盖了onMenuOpened and onPanelClosed内的方法Activity 然而 在所
  • 从 Java 拖放到 Windows 资源管理器

    我想用 Java 创建一个应用程序 列出一个目录并向其添加拖放支持 以便将文件从该目录复制到打开的资源管理器窗口 反之亦然 Windows 系统 虽然添加对从 Windows 资源管理器到 Java 应用程序的拖放的支持非常容易 但当操作从
  • oracle sql listagg [重复]

    这个问题在这里已经有答案了 SELECT deptno LISTAGG ename WITHIN GROUP ORDER BY ename AS employees FROM emp GROUP BY deptno 错误 ORA 00923
  • Java如何访问try-catch块之外的变量

    我是java初学者 正在玩try catch块 但是 我无法获取try catch块之外的变量 以下代码有效 class factorial public static void main String args try int num I
  • Buildroot:仅构建一个包作为共享和静态库,所有其他包仅共享

    buildroot 提供了构建的可能性 仅静态 只分享 或共享库和静态库 所选软件包的数量 分配的配置元素是BR2 STATIC LIBS BR2 STATIC LIBS and BR2 SHARED STATIC LIBS 问题 是否可以
  • ECS 任务/容器的 Terraform AWS CloudWatch 日志组

    我正在尝试使用 Terraform 创建一个 AWS ECS 任务 它将日志放入 CloudWatch 上的特定日志组中 问题是容器定义位于 JSON 文件中 我无法将 CloudWatch 组名称从 tf 文件映射到该 json 文件 容
  • 打破 tcl 中的父循环

    我在 while 循环中有一个 for 循环 我有一个条件要打破 for 循环中的 while 这是代码 while gets thefile line gt 0 for set i 1 i lt count table incr i if
  • 计算两个 GPS 坐标之间的罗盘方位时出现问题

    在我的 web 应用程序中 有一个来自数据库查询的 JSON 数据响应 其中包括 1 到 n 个位置的纬度 经度坐标 我想计算轴承data i 位置到当前位置 我一直在调整代码here http www movable type co uk
  • 如何在spray-json中表示可选字段?

    我的请求有一个可选字段 case class SearchRequest url String nextAt Option Date 我的协议是 object SearchRequestJsonProtocol extends Defaul
  • 获取this.title属性的前2个字符,并调用对应的id

    我试图检索链接标题属性的前两个字符 将其存储到变量中 然后将该变量作为函数调用 在代码中 它说 s 是我想要放置该值的位置 有任何想法吗 flow click function if labelstatus 1 rmflow a weflo
  • 错误:“使用移动值”

    我目前正在学习 Rust 并且正在使用一个简单的计算器 重构时 我最终得到了如下代码 enum OptionalToken Foo Bar fn next token gt OptionalToken Read input classify
  • JavaScript:如何动态“过滤”我的对象

    我如何使用 JavaScript filter 属性作为过滤器我的 JavaScript 对象 我一直在阅读以下内容StackOverflow 帖子 https stackoverflow com questions 1694717 jav
  • 如何使用 Firefox Addon Builder 记录选定的文本?

    我遵循了几个教程但没有成功 我认为这是一个经典的例子 但我无法让它发挥作用 我可以保存我的项目 安装插件 当我选择一些文本时 我可以看到上下文菜单项 日志选择 但是当我单击它时 什么也没有发生 exports main function v
  • jquery 上下文选择器与 .find()

    什么更有效 var container container 1 var links1 container find a 2 var links2 a container 我个人比较喜欢 a container 因为看起来更好 但是它们的性能
  • Makefile `echo -n' 不起作用

    我试图让我的 Makefile 回显文本而不带尾随换行符 但我做不到 我在 OS X 上遇到了这种行为 在 Linux 上一切都按预期工作 Makefile a echo n hello b echo n hello c bin echo
  • 根据控制器响应动态更改视图部分

    我正在寻找以下场景的最佳方法建议 用户可以选择一个或多个 csv 文件进行验证 附件 1 单击 验证 按钮会执行验证代码 显示进度条 直到返回输出 返回响应可以是成功消息 也可以是选择验证的每个文件的错误详细信息 附件 2 现在可以使用 上