【问题标题】:How to create a list object from outerHTML value of a table?如何从表的 outerHTML 值创建列表对象?
【发布时间】:2017-04-23 10:03:03
【问题描述】:

请查看this fiddle

这有一个外部HTML var。现在,我必须将其创建为对象列表;对象将是每一行。
在此示例中,行号为 3 ,但我将在

之类的 var 中获取它
var maxrow = $('#rownumber').val();
var TotalObject = [] ;

这将包含:

{
    {column1header :row1col1value ,column2header :row1col2value ,column3header :row1col3value,column4header :row1col4value },
    {column1header :row2col1value ,column2header :row2col2value ,column3header :row2col3value,column4header :row2col4value },
    {column1header :row2col1value ,column2header :row2col2value ,column3header :row2col3value,column4header :row2col4value }
}

然后,我必须通过 ajax 调用将此对象列表发送到我的控制器操作方法:

[httppost]
public PartialViewResult MyAction(list<mymodel> model)
{


   return Partialview ("mypartialview",model);
}

mymodel 也有IEnumerable&lt;mymodel&gt;,我必须将this 转换为that

【问题讨论】:

    标签: javascript jquery asp.net-mvc c#-4.0


    【解决方案1】:

    这个方法怎么样:

    1. 使用正则表达式清理输入
    2. 将其拆分为数组
    3. 为您的数据创建iterator
    4. 将结果推送到 JSON 对象中
    5. 使用 Ajax 发送 JSON 结果?

    编辑:我改进了 cleanup 正则表达式;它现在应该考虑空值。
    它基于 HTML 标记,在您的示例中无效(缺少 &lt;/tr&gt;&lt;tr&gt; 标记)。

    var outerhtml = "\r\n\r\n<thead>\r\n\r\n<tr>\r\n\r\n<th>\r\n\r\ncolumn1header\r\n\r\n\r\n\r\n</th>\r\n\r\n<th>\r\n\r\ncolumn2header\r\n\r\n</th>\r\n\r\n<th>\r\n\r\ncolumn3header\r\n\r\n</th>\r\n\r\n<th>\r\n\r\ncolumn4header\r\n\r\n</th>\r\n\r\n</tr>\r\n\r\n</thead>\r\n\r\n<tbody>\r\n\r\n<tr>\r\n\r\n<td>\r\n\r\nrow1col1value\r\n\r\n</td>\r\n\r\n<td>\r\n\r\nrow1col2value\r\n\r\n</td>\r\n\r\n<td>\r\n\r\nrow1col3value\r\n\r\n</td>\r\n\r\n<td>\r\n\r\nrow1col1value\r\n\r\n</td>\r\n\r\n</tr>\r\n\r\n<tr>\r\n\r\n<td>\r\n\r\nrow2col1value\r\n\r\n</td>\r\n\r\n<td>\r\n\r\nrow2col2value\r\n\r\n</td>\r\n\r\n<td>\r\n\r\nrow2col3value</td>\r\n\r\n<td>\r\n\r\nrow2col4value\r\n\r\n</td>\r\n\r\n</tr>\r\n\r\n<td>\r\n\r\nrow3col1value\r\n\r\n</td>\r\n\r\n<td>\r\n\r\n row3col2value\r\n\r\n </td>\r\n\r\n<td>\r\n\r\nrow3col3value\r\n\r\n</td>\r\n\r\n <td>\r\n\r\n row3col4value \r\n\r\n </td>\r\n\r\n</tbody>\r\n\r\n";
    
    const data = outerhtml.split("\r\n").join("");
    const [_,h,v] = /(?:<thead><tr>(.*)<\/tr><\/thead>)(?:<tbody>(.*)<\/tbody>)/igm.exec(data);
    
    const headers = h.split("</th><th>")
                     .map(t => t.replace("<th>","")
                                .replace("</th>",""));
    
    const values = v.match(/(?:<td>\s*(\s*\w*)\s*<\/td>)/igm)
                    .map(t => t.replace("<td>","")
                               .replace("</td>","")
                               .trim());
    
    const iterator = function(array){
      const coll = [...array];
      return {
        [Symbol.iterator](){
          let nextIndex = 0;
          return {
            next: function(){
              const _r = {
                [headers[0]] : coll[nextIndex],
                [headers[1]] : coll[nextIndex+1],
                [headers[2]] : coll[nextIndex+2],
                [headers[3]] : coll[nextIndex+3]
              };
              nextIndex += 4;
              return nextIndex <= coll.length ?
                {value: _r, done: false} :
                {done: true};
            }
          }
        }
      }
    }
    let json=[];
    const tuples = iterator(values);
    for(tuple of tuples){
      json.push(tuple);
    }
    
    console.log(json);

    【讨论】:

    • 谢谢。但我可以知道为什么它只创建两个对象,一共有三行。
    • 它忽略了其中一个空值。给我几分钟。
    • 还有另一个问题,假设其中一行中的一个单元格没有任何值,它取下一个单元格的值
    • 我已经用更新的 outerhtml jsfiddle.net/shaswatatripathy/r4bLa1af更新了小提琴
    • 假设我有一个包含行号的 var,它对这个逻辑有帮助吗
    猜你喜欢
    • 2020-03-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2011-09-07
    相关资源
    最近更新 更多