RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-179270

Bald's questions

Martin Hope
Bald
Asked: 2023-08-02 12:14:21 +0000 UTC

下载大文件时 Asp.Net WebApi 出错

  • 5

有以下方法

[Route("{id:int}/attachment"), HttpGet]
public HttpResponseMessage GetAttachment([FromUri]int id)
{
    var result = Request.CreateResponse(HttpStatusCode.OK);
    var fileName = "Имя файла";
    var mimeType = MimeMapping.GetMimeMapping(fileName);
    try
    {
        var path = "Путь к файлу";
        result.Content = new ByteArrayContent(File.ReadAllBytes(path));
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            { FileName = HttpUtility.UrlPathEncode(fileName) };
        result.Content.Headers.Add("Content-Type", mimeType);
        return result;
    }
    catch (Exception e)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, e.Message);
    }
}

文件下载是通过向对应的webapi端点发送ajax请求发起的,在开发者控制台发送请求一段时间后,请求获取到状态 (failed )net::ERR_CONNECTION_RESET,在系统日志中发现以下错误操作系统

ArithmeticException 算术运算中溢出或精度丢失。
http://localhost:58863/api/operations/22461/items/226512/attachment

事实证明,只有大文件才会出现此问题,在本例中文件大小为 1.4GB。

如何下载大文件

c#
  • 1 个回答
  • 43 Views
Martin Hope
Bald
Asked: 2020-04-26 13:12:47 +0000 UTC

如何找到由“用户”数据组成的集合的差异?

  • 2

我需要找到两个集合之间的区别,集合的元素是自定义类的实例。

为了找到差异,我想使用 linq 方法except,该方法的描述说,对于自定义类型,您需要做以下两件事之一:

从原始类继承自定义类IEquatable<T>并覆盖Equals&方法GetHashCode

public class OperationItem: IEquatable<OperationItem>
{

    public bool Equals(OperationItem other)
    {
        if (other is null)
            return false;

        return this.Name == other.Name && this.Code == other.Code;
    }

    public override bool Equals(object obj) => Equals(obj as OperationItem);
    public override int GetHashCode() => (Name, Code).GetHashCode();
}

或者通过实现接口IEqualityComparer<T>和实现我们已经知道的方法来创建我们需要的比较器Equals&GetHashCode

public class OperationItemComparer: IEqualityComparer<OperationItem>
{
    public bool Equals(OperationItem x, OperationItem y)
    {
        /*Реализация*/
    }

    public int GetHashCode(OperationItem obj)
    {
        /*Реализация*/
    }
}

使用一种或另一种方法是否有显着差异,如果无法更改原始类,我假设使用第二种方法,但使用一种或另一种方法可能还有其他原因?

c#
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-01-24 13:45:17 +0000 UTC

如何在 vue-router 的新选项卡中打开链接?

  • 2

使用vue-router时如何在vue应用程序的新选项卡中打开链接?

vue.js
  • 2 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-12-17 17:20:29 +0000 UTC

如何在代码中确定对象属性是可迭代的?

  • 1

我想制作一个通用方法来卸载 pdf 中的表格。

大纲方法:

static PdfPTable printTable<T>(IEnumerable<ColumnDefinition> columns, IEnumerable<T> rows, Font font)
{
    var table = new PdfPTable(columns.Count());

    foreach (var row in rows)
    {
        foreach (var column in columns)
        {
            var value = column.Property.GetValue(row, null);
            System.Diagnostics.Debug.WriteLine(value as Enumerable);
            if (value is IEnumerable<DTO.StateReason> nestedRows)
            {
                table.AddCell(new PdfPCell(printTable(nestedRows.GetColumnDefinitions(), nestedRows, font)) { Padding = 0});
            }
            else
            {
                var textContent = string.Empty;
                if (value != null && !string.IsNullOrEmpty(column.Format))
                {
                    switch (column.TypeName)
                    {
                        case nameof(DateTime):
                            {
                                textContent = ((DateTime)value).ToString(column.Format);
                                break;
                            }
                        case nameof(Int16):
                        case nameof(Int32):
                        case nameof(Int64):
                            {
                                textContent = ((int)value).ToString(column.Format);
                                break;
                            }
                        case nameof(Decimal):
                            {
                                textContent = ((decimal)value).ToString(column.Format);
                                break;
                            }
                        default:
                            break;
                    }
                }
                else if(value != null)
                {
                    textContent = value.ToString();
                }
                table.AddCell(new PdfPCell(new Phrase(textContent, font)));
            }
        }
    }
    return table;
}

方法实现GetColumnDefinition

static IEnumerable<ColumnDefinition> GetColumnDefinitions<T>(this IEnumerable<T> source)
{
    try
    {
        var index = 0;
        var result = (from property in typeof(T).GetProperties().OrderBy(x => x.Name)
                      let columnAttribute = property.GetCustomAttributes(typeof(ColumnAttribute), true).SingleOrDefault() as ColumnAttribute
                      let formatAttribute = property.GetCustomAttributes(typeof(DisplayFormatAttribute), true).SingleOrDefault() as DisplayFormatAttribute
                      let ignoreAttribute = property.GetCustomAttributes(typeof(IgnoreAttribute), true).SingleOrDefault() as IgnoreAttribute
                      where ignoreAttribute == null
                      select new ColumnDefinition
                      {
                          Property = property,
                          Name = columnAttribute?.Name ?? property.Name,
                          TypeName = columnAttribute?.TypeName ?? string.Empty,
                          Format = formatAttribute?.DataFormatString ?? string.Empty,
                          Order = columnAttribute?.Order ?? index++
                      })
                      .OrderBy(x => x.Order);
        return result;
    }
    catch (Exception e)
    {
        throw;
    }
}

将表格打印为 pdf 的示例类

public class ActHistoryList
{
    [Services.Exports.Ignore]
    public int Id { get; set; }
    [Services.Exports.Ignore]
    public int StateId { get; set; }
    [Column("Состояние", Order = 0)]
    public string State { get; set; }
    [Column(Order = 1)]
    public IList<StateReason> Reasons { get; set; } = new List<StateReason>();
    [Column("Дата/Время", Order = 2, TypeName = nameof(DateTime)), DisplayFormat(DataFormatString = "dd.MM.yyyy HH:mm")]
    public DateTime Timestamp { get; set; }
    [Column("Автор", Order = 3)]
    public string Author { get; set; }
}

public class StateReason
{
    [Services.Exports.Ignore]
    public int Id { get; set; }
    [Column("Основание", Order = 1)]
    public string Name { get; set; }
    [Column("Комментарий", Order = 2)]
    public string Description { get; set; }
}

代码可以运行,如果值值是数组、集合等,我不知道如何实现递归调用,在代码if(value is IEnumerable<DTO.StateReason> nestedRows)中它DTO.StateReason可以是任何类。

c#
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-08-02 18:38:47 +0000 UTC

使用服务时如何正确解析 *context*?

  • 1
public class Act
{
    public int Id {get;set;}
    public virtual Operation Operation {get;set;}
}

public class Operation
{
    public int Id {get;set;}
    public virtual Act Act {get;set;}
}

public class ActService
{
    private readonly DbContext _context;

    public ActService(DbContext context)
    {
        this._context = context;
    }
    public void Delete(int actId)
    {
        var entity = _context.Set<Act>().Single(x => x.Id == actId);
        //бизнес логика удаления объекта
        _context.Entry(entity).State = EntityState.Deleted;
        _context.SaveChanges()
    }
}

public OperationService
{
    private readonly DbContext _context;
    private readonly ActService _actService;

    public OperationService(DbContext context, ActService actSErvice)
    {
        this._context = context;
        this._actService = actService;
    }

    public void Delete(int operationId)
    {
        var entity = _context.Set<Operation>().Include(x => x.Act)(x => x.Id == operationId);
        //бизнес логика удаления объекта
        using(var transaction = _context.Database.BeginTransaction())
        {
            try
            {
                _actService.Delete(operation.Act.Id);
                _context.Entry(entity).State = EntityState.Deleted;
                _context.SaveChanges();
                transaction.Commit();
            }
            catch(Exception)
            {
                throw;
            }
        }
    }
}

该项目使用autofac版本 4.6.1。依赖注入通过构造函数发生。

告诉我如何正确实现依赖关系解析,这样就不会违反应该删除所有内容或不删除任何内容的逻辑。

PS:我阅读了网站上的帮助,我认为它DbContext应该作为服务实现,.InstancePerLifetimeScope()但我.InstancePerRequest()不确定。

entity-framework
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-07-30 12:58:59 +0000 UTC

服务器端的复合标识符生成

  • 0

告诉我如何正确实现以下获取唯一键的逻辑。键应包含以下数据:该行在数据库中创建的年份和月份,以及每个月从 1 开始的序列号,当月数据库中每新行该值应增加 1 .

要添加到表中的第一行必须具有以下唯一标识符:{Текущий год}{separator}{Текущий месяц}{separator}{Порядковый номер}

目前它是这样实现的:

  1. 从数据库中获取最后一行
  2. 我们解析一个唯一标识符并将其放入变量中:year, month,number
  3. 我们得到该行为的序列号:currentNumber = currentMonth == month ? number++ : 1;

    CREATE TABLE dbo.[table] (Id int IDENTITY, Number varchar(50) NULL, CONSTRAINT PK_table_Id PRIMARY KEY CLUSTERED (Id))

如果我不能表达问题的主要意思,我很抱歉,我不明白如何正确实现准确获取文档的序列号,如何保证其在一个月内的唯一性,以及在一个月内归零变化

база-данных
  • 3 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-11-22 13:42:39 +0000 UTC

如何设置多对多关系的键名?

  • 5

对于数据库开发,我使用代码优先的方法。有两个班

public class Assembly
{
    public int Id {get;set;}

    public virtual ICollection<OperationItem> Items {get;set;} = new List<OperationItem>();
}

public class OperationItem
{
    public int Id {get;set;}

    public virtual ICollection<Assembly> Assemblies {get;set;} = new List<Assembly>();
}

基于此,实体框架生成如下迁移:

CreateTable(
    "dbo.AssemblyOperationItems",
    c => new
        {
            Assembly_Id = c.Int(nullable: false),
            OperationItem_Id = c.Int(nullable: false),
        })
    .PrimaryKey(t => new { t.Assembly_Id, t.OperationItem_Id })
    .ForeignKey("dbo.Assemblies", t => t.Assembly_Id)
    .ForeignKey("dbo.OperationItems", t => t.OperationItem_Id)
    .Index(t => t.Assembly_Id)
    .Index(t => t.OperationItem_Id);

迁移脚本本身是正确的,我对分配的名称不满意:Assembly_Id & OperationItem_Id,并且在所有其他表中调用了键AssemblyId & OperationItemId。

_在创建多对多关系时,是否可以告诉 EF 在不使用名称中的键的情况下生成名称。

PS我知道如果您通过创建链接可以解决此问题fluent api,我对不同的解决方案,注释属性等感兴趣。

c#
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-10-27 16:27:25 +0000 UTC

为什么 $watch 在对象更改时不总是触发?

  • 3

var app = angular.module('testApp', ['ui.bootstrap', 'ui.select']);

app.decorator('uiSelectMatchDirective', function($rootScope, $delegate) {
  var originalLinkFn = $delegate[0].link;
  $delegate[0].compile = function(element) {
    return function(scope, elm, attrs, controller) {
      elm.bind('click', function() {
        $rootScope.$broadcast('customSelect', scope.$selectMultiple.activeMatchIndex);
      });
      originalLinkFn.apply($delegate, arguments);
    };
  };
  return $delegate;
});

app.decorator('uiSelectMultipleDirective', function($delegate) {
  var originalLinkFn = $delegate[0].link;
  $delegate[0].compile = function(element) {
    return function(scope, elm, attrs, controller) {
      scope.$on('uis:select', function(event, item) {
        scope.$selectMultiple.activeMatchIndex = controller[0].selected.length;
      });
      originalLinkFn.apply($delegate, arguments);
    };
  };
  return $delegate;
});

app.controller('detailsController', function($scope, toolService) {
    $scope.assembly = {
      tools: []
    };

    $scope.$on('customSelect', function(event, value) {
      $scope.tool = $scope.assembly.tools[value];
      console.log('from handler custom select');
    });

    $scope.$watch('tool', function(value) {
      console.log('from watch')
    });

    $scope.onSelectTool = function(tool) {
      $scope.tool = $scope.assembly.tools[$scope.assembly.tools.indexOf(tool)];
    };
  $scope.tools = toolService.getTools();
});

app.factory('assemblyService', function() {
  var assemblies = [{
      "Position": 1.00,
      "Tools": [{
          "Id": 104,
          "Type": "Центровочное сверло D10 ∠90°",
          "OrderCode": "D5306100",
          "Vendor": "YG-1",
          "IsConsumables": true,
          "Sequance": 14,
          "Overhang": 40.00,
          "AmountCuttingEdge": 0,
          "AmountPlates": 0,
          "Durability": 200.00,
        },
        {
          "Id": 53,
          "Type": "Термопатрон ",
          "OrderCode": "50 10 A63 S",
          "Vendor": "POKOLM",
          "IsConsumables": false,
          "Sequance": 6,
          "Overhang": 40.00,
          "AmountCuttingEdge": 0,
          "AmountPlates": 0,
          "Durability": 200.00
        }
      ],
      "Runtime": 1.00,
      "Note": null
    },
    {
      "Position": 5.00,
      "Tools": [{
          "Id": 889,
          "Type": "Корпус фрезы D42 z5",
          "OrderCode": "5 42 367",
          "Vendor": "POKOLM",
          "IsConsumables": false,
          "Sequance": 14,
          "Overhang": 43.00,
          "AmountCuttingEdge": 2,
          "AmountPlates": 5,
          "Durability": 90.00
        },
        {
          "Id": 750,
          "Type": "Пластина r2",
          "OrderCode": "04 67 896 R20 M40",
          "Vendor": "POKOLM",
          "IsConsumables": true,
          "Sequance": 12,
          "Overhang": 43.00,
          "AmountCuttingEdge": 2,
          "AmountPlates": 5,
          "Durability": 90.00
        },
        {
          "Id": 890,
          "Type": "Патрон ",
          "OrderCode": "HSK 63-16-50",
          "Vendor": "KEMMLER",
          "IsConsumables": false,
          "Sequance": 6,
          "Overhang": 43.00,
          "AmountCuttingEdge": 2,
          "AmountPlates": 5,
          "Durability": 90.00
        }
      ],
      "Runtime": 40.00,
      "Note": null
    },
    {
      "Position": 9.00,
      "Tools": [{
          "Id": 891,
          "Type": "Фреза D20 r1",
          "OrderCode": "ф20R1z4 nACRo ТП",
          "Vendor": "ТЕХНОПОЛИС",
          "IsConsumables": true,
          "Sequance": 14,
          "Overhang": 70.00,
          "AmountCuttingEdge": 0,
          "AmountPlates": 0,
          "Durability": 180.00
        },
        {
          "Id": 223,
          "Type": "Термопатрон ",
          "OrderCode": "60 20 A63 S",
          "Vendor": "POKOLM",
          "IsConsumables": false,
          "Sequance": 6,
          "Overhang": 70.00,
          "AmountCuttingEdge": 0,
          "AmountPlates": 0,
          "Durability": 180.00
        }
      ],
      "Runtime": 6.00,
      "Note": null
    },
    {
      "Position": 11.00,
      "Tools": [{
          "Id": 1241,
          "Type": "Фреза D12 r2",
          "OrderCode": "ф12R2z4 nACRo ТП",
          "Vendor": "ТЕХНОПОЛИС",
          "IsConsumables": true,
          "Sequance": 14,
          "Overhang": 55.00,
          "AmountCuttingEdge": 0,
          "AmountPlates": 0,
          "Durability": 180.00
        },
        {
          "Id": 51,
          "Type": "Термопатрон ",
          "OrderCode": "50 12 A63 S",
          "Vendor": "POKOLM",
          "IsConsumables": false,
          "Sequance": 6,
          "Overhang": 55.00,
          "AmountCuttingEdge": 0,
          "AmountPlates": 0,
          "Durability": 180.00
        }
      ],
      "Runtime": 40.00,
      "Note": null
    },
    {
      "Position": 15.00,
      "Tools": [{
          "Id": 547,
          "Type": "Сверло D5.60",
          "OrderCode": "DH451056",
          "Vendor": "YG-1",
          "IsConsumables": true,
          "Sequance": 14,
          "Overhang": 25.00,
          "AmountCuttingEdge": 0,
          "AmountPlates": 0,
          "Durability": 100.00
        },
        {
          "Id": 78,
          "Type": "Термопатрон ",
          "OrderCode": "50 06 A63 S",
          "Vendor": "POKOLM",
          "IsConsumables": false,
          "Sequance": 6,
          "Overhang": 25.00,
          "AmountCuttingEdge": 0,
          "AmountPlates": 0,
          "Durability": 100.00
        }
      ],
      "Runtime": 3.00,
      "Note": null
    }
  ];
  return {
    getAssemblies: () => {
      return assemblies.slice();
    }
  };
});

app.factory('toolService', function() {
  var tools = [{
      "Id": 104,
      "Type": "Центровочное сверло D10 ∠90°",
      "OrderCode": "D5306100",
      "Vendor": "YG-1",
      "IsConsumables": true
    },
    {
      "Id": 53,
      "Type": "Термопатрон ",
      "OrderCode": "50 10 A63 S",
      "Vendor": "POKOLM",
      "IsConsumables": false
    },
    {
      "Id": 889,
      "Type": "Корпус фрезы D42 z5",
      "OrderCode": "5 42 367",
      "Vendor": "POKOLM",
      "IsConsumables": false
    },
    {
      "Id": 750,
      "Type": "Пластина r2",
      "OrderCode": "04 67 896 R20 M40",
      "Vendor": "POKOLM",
      "IsConsumables": true
    },
    {
      "Id": 890,
      "Type": "Патрон ",
      "OrderCode": "HSK 63-16-50",
      "Vendor": "KEMMLER",
      "IsConsumables": false,
    },
    {
      "Id": 891,
      "Type": "Фреза D20 r1",
      "OrderCode": "ф20R1z4 nACRo ТП",
      "Vendor": "ТЕХНОПОЛИС",
      "IsConsumables": true
    },
    {
      "Id": 223,
      "Type": "Термопатрон ",
      "OrderCode": "60 20 A63 S",
      "Vendor": "POKOLM",
      "IsConsumables": false
    },
    {
      "Id": 1241,
      "Type": "Фреза D12 r2",
      "OrderCode": "ф12R2z4 nACRo ТП",
      "Vendor": "ТЕХНОПОЛИС",
      "IsConsumables": true
    },
    {
      "Id": 51,
      "Type": "Термопатрон ",
      "OrderCode": "50 12 A63 S",
      "Vendor": "POKOLM",
      "IsConsumables": false
    },
    {
      "Id": 547,
      "Type": "Сверло D5.60",
      "OrderCode": "DH451056",
      "Vendor": "YG-1",
      "IsConsumables": true
    },
    {
      "Id": 78,
      "Type": "Термопатрон ",
      "OrderCode": "50 06 A63 S",
      "Vendor": "POKOLM",
      "IsConsumables": false
    }
  ];
  return {
    getTools: () => {
      return tools.slice();
    }
  };
});
<script src="https://code.angularjs.org/1.5.8/angular.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-select/0.19.4/select.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular-animate.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular-touch.js"></script>
<script src="https://cdn.rawgit.com/angular-ui/bootstrap/gh-pages/ui-bootstrap-tpls-2.5.0.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-select/0.19.4/select.min.js"></script>

  <div class="panel panel-default"  ng-app="testApp" ng-controller="detailsController">
    <div class="panel-body">
      <div class="form-horizontal">
        <div class="form-group">
          <label class="control-label col-md-3">Инструмент</label>
          <div class="col-md-9">
            <ui-select multiple ng-model="assembly.tools" limit="100" on-select="onSelectTool($item)">
              <ui-select-match placeholder="Введите строку для поиска">{{$item.OrderCode}}</ui-select-match>
              <ui-select-choices repeat="tool in (tools| filter:$select.search | limitTo:$select.limit)">
                <span ng-bind="tool.OrderCode"></span>
                <p class="small" ng-bind="tool.Type"></p>
              </ui-select-choices>
            </ui-select>
          </div>
        </div>
        <div class="form-group">
          <label class="control-label col-md-3">Кол-во режущих граней</label>
          <div class="col-md-9">
            <input type="number" class="form-control" ng-model="tool.AmountCuttingEdge" />
          </div>
        </div>
        <div class="form-group">
          <label class="control-label col-md-3">Кол-во пластин</label>
          <div class="col-md-9">
            <input type="number" class="form-control" ng-model="tool.AmountPlates" />
          </div>
        </div>
        <div class="form-group">
          <label class="control-label col-md-3">Вылет</label>
          <div class="col-md-9">
            <input type="number" class="form-control" ng-model="tool.Overhang" />
          </div>
        </div>
        <div class="form-group">
          <label class="control-label col-md-3">Стойкость</label>
          <div class="col-md-9">
            <input type="number" class="form-control" ng-model="tool.Durability" />
          </div>
        </div>
      </div>
    </div>
  </div>

使用装饰器(创建事件)对原始指令进行了细微更改。

$rootScope.$broadcast('customSelect', scope.$selectMultiple.activeMatchIndex);

在控制器中处理此事件

$scope.$on('customSelect', function(event, value){
     console.log('from custom select');
     $scope.tool = $scope.assembly.tools[value];
});

我也跟随控制器的变化tool使用$watch

$scope.$watch('tool', function(value){
    console.log('from watch');
});

我们在下拉列表中选择任意数量的工具,每个添加的位置都会变为活动状态,使用btn-primary引导程序中的一个类。

当您第一次单击控制台中的选定位置之一时,您可以看到事件处理程序已经工作,customSelect这反过来又发生了变化 $scope.tool,但由于某种原因,处理程序不起作用$watch,如果您再次单击相同的元素,您可以在控制台中看到两个处理程序都有效。

告诉我为什么会这样。

angularjs
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-10-06 12:54:52 +0000 UTC

如何显示ajax请求触发的文件下载进度?

  • 1

我试图显示从服务器下载文件的进度,为此我将以下代码放入指令中:

var app = angular.module('app', ['ui.bootstrap']);

app.controller('downloadCtrl', function($scope) {
  $scope.disabled = false;
  let ctrl = this;
  ctrl.download = function(response) {
    let file = response.data;
    let fileName = response.headers('Content-Disposition').match(/filename(?:(?:\*=UTF-8'')|(?:=))(.*)/)[1];
    let fileReader = new FileReader();
    fileReader.onloadstart = () => {
      $scope.apply(function() {
        $scope.disabled = true;
      });
    };
    fileReader.onload = function() {
      let blob = new Blob([new Uint8Array(this.result)], {
        type: file.type
      });
      let objectUrl = URL.createObjectURL(blob);
      let a = document.createElement('a');
      a.download = decodeURI(fileName.replace(/[\"]/gi, ''));
      a.href = objectUrl;
      document.body.appendChild(a);
      a.click();
      setTimeout(function() {
        document.body.removeChild(a);
        URL.revokeObjectURL(objectUrl);
        $scope.$apply(function() {
          $scope.disabled = false;
        });
      }, 2000);
    };
    fileReader.onprogress = data => {
      console.log(data);
      if (data.lengthComputable) {
        let progress = parseInt(((data.loaded / data.total) * 100), 10);
        console.log(progress);
        $scope.$apply(function() {
          $scope.progress = progress;
        });
      }
    };
    fileReader.readAsArrayBuffer(file);
  };
});

app.directive('download', function($http) {
  return {
    restrict: 'EA',
    templateUrl: 'download.html',
    scope: {},
    controller: 'downloadCtrl',
    link: function(scope, element, attrs, controller) {
      element.on('click', function(){
        let url = 'https://github.com/angular-ui/bootstrap/archive/master.zip';
        console.log(url);
        $http.get(url).then(response => {
          console.log(response);
          controller.download(response); });
      })
    }
  };
});
.btn > .progress {
  margin-bottom: 0;
  width: 100px;
}
<html>

<head>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" />
  <script src="https://code.angularjs.org/1.5.8/angular.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular-animate.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular-touch.js"></script>
  <script src="https://cdn.rawgit.com/angular-ui/bootstrap/gh-pages/ui-bootstrap-tpls-2.5.0.js"></script>
  <script type="text/ng-template" id="download.html">
    <button class="btn btn-default" ng-disabled="disabled">
        <span class="glyphicon glyphicon-download-alt" ng-hide="disabled"></span>
        <span uib-progressbar class="progress-striped active" value="progress" ng-show="disabled"></span>
      </button>
  </script>
</head>

<body ng-app="app">
  <div class="container">
    <div class="panel panel-default">
      <div class="panel-body">
        <download></download>
      </div>
    </div>
  </div>
</body>

</html>

这段代码有效,但有一个小缺点:我们打开开发者控制台并观察执行过程:

  1. 对服务器接收文件的请求正在等待中。
  2. 收到服务器的响应,在开发者控制台中可以看到正在接收文件(进度条尚不可见)
  3. 当进度达到 50..75%(目测,来自开发者控制台)时,会出现一个进度条,然后一切正常。

在事件处理程序中向控制台添加onprogress输出,接收到文件后,控制台中出现进度值:12,17,31,45,59,74,78,92,100

告诉我我做错了什么,为什么在开始下载文件后没有立即显示进度条?

PS:在最近版本的 Firefox 和 Chrome 中重复该行为

javascript
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-08-08 16:39:12 +0000 UTC

如何从服务器返回带有俄文文本的错误消息?

  • 2

我在服务器上有一个方法:

[HttpPost]
public ActionResult(Document model)
{
    //какая то проверка
    if()
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Какой то текст");
    }
}

当满足块中的条件时if,会响应错误,仅在字段中statusText而不是Some text出现krakozyabra。

告诉我如何使用非英语文本从服务器返回错误。

PS:

  • 编码在页面上设置utf-8;
  • 响应标头设置为编码utf-8
  • 源代码文件也编码utf-8
angularjs
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-04-07 12:56:28 +0000 UTC

使用 Code First 时如何创建包含行的索引?

  • 2

我正在使用实体框架版本 6.1.3。域模型类如下所示:

public class ReferenceBook
{
    public int Id {get;set;}
    [Index("IX_ParentId_Name", IsUnique = true, Order = 1)]
    public int? ParentId {get;set;}
    [Required, Index("IX_ParentId_Name", IsUnique = true, Order = 2)]
    public string Name {get;set;}
}

当我尝试运行生成的迁移时,出现错误:

“dbo.Items”表中“名称”列的类型不允许将其选为索引键列。

关于stackoverflow的类似问题

c#
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-03-15 13:35:24 +0000 UTC

如何防止在多页文档中创建“悬挂”行?

  • 2

我需要制作一个打印的表格(报告),其中,除其他外,(页眉,页脚)将显示一个表格,如下面的代码片段所示。

我想给pdf用户一个文件,为此我使用itextsharpnuget包版本 5.5.10

请告诉我。如有必要,如何将整行(T1、T2等)转移到新页面

th, td{
  border: 2px solid black;
}
<table>
  <tr>
    <td rowspan = 2>T1</td>
    <td>OrderCode 1</td>
    <td>Vendor</td>
    <td rowspan = 2>Overhang</td>
    <td rowspan = 2>Runtime</td>
  </tr>
  <tr>
    <td>OrderCode2</td>
    <td>Vendor</td>
  </tr>
  <td rowspan = 2>T2</td>
    <td>OrderCode 3</td>
    <td>Vendor</td>
    <td rowspan = 2>Overhang</td>
    <td rowspan = 2>Runtime</td>
  </tr>
  <tr>
    <td>OrderCode4</td>
    <td>Vendor</td>
  </tr>
  <td rowspan = 2>T3</td>
    <td>OrderCode 4</td>
    <td>Vendor</td>
    <td rowspan = 2>Overhang</td>
    <td rowspan = 2>Runtime</td>
  </tr>
  <tr>
    <td>OrderCode5</td>
    <td>Vendor</td>
  </tr>
</table>

pdf文件创建代码

using(var fs = new FileStream(path))
{
    var document = new Document(PageSize.A4.Rotate(), 10,10,10,10);
    var pdfWriter = PdfWriter.GetInstance(document, fs);
    var table = new PdfPTable(5);

    var tools = new List<int> {1,2,3};

    for(var row = 0; row<50; row++)
    {
        table.AddCell(new PdfPTable(new Phrase($"T{row}")){Rowspan = tools.Count});
        table.AddCell($"Cutter №{tools.First()});
        table.AddCell("Vendor");
        table.AddCell(new PdfPTable(new Phrase("Overhang")){Rowspan = tools.Count});
        table.AddCell(new PdfPTable(new Phrase("Runtime")){Rowspan = tools.Count});
        foreach(var tool in tools.Skip(1))
        {
            table.AddCell($"Cutter №{tool});
            table.AddCell("Vendor");
        }
    }
    document.Add(table);
    document.Close();
    pdfWriter.Close();
}
c#
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-09-16 12:59:10 +0000 UTC

Linq Left Join:是否可以优化 linq 查询?

  • 0

我需要向用户展示一个视图,要显示的信息在不同的表中。

为了简单起见,我在多个请求中获取数据,之后我使用左连接将所有数据粘合在一起。

linq请求看起来像这样:

var operations = _context.Set<Operation>()
                    .Include(x=>x.Product)
                    .ToList();

var timeWorks = _context.Set<OperationItem>()
                    .Where()
                    .ToList();

var attachments = _context.Set<OperationItem>()
                    .Where()
                    .ToList();

var result = operations
                 .GroupJoin(attachments, o=>o.Id, i=>i.OperationId, (l,r)=> new {Operation = l, Attachment = r})
                 .SelectMany(x=>x.Attachment.DefaultIfEmpty(), (l,r)=>new {Operation = l.Operation, Attachment = r})
                 .GroupJoin(timeWorks, o=>o.Operation.OperationId, i=>i.OperationId, (l,r)=> new {Operation = l.Operation, Attachment = l.Attaqchment, TimeWork = r.Sum(_=>_.TimeWork)})
                 .Select(x=> new OperationList
                 {
                     //Собираем окончательное представление
                 })
                 .ToList();

一切正常,但我不喜欢每个左连接我都必须遍历前一个连接的结果:

new {Operation = l.Operation, Attachment = l.Attaqchment, TimeWork = r.Sum(_=>_.TimeWork)}

你能告诉我我做错了什么或者有更简单的方法吗?

c#
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-09-02 16:15:22 +0000 UTC

如何测试不返回值的方法?

  • 11

假设我有以下课程

public class Residue
{
    public int Id {get;set;}
    public int WarehouseId {get;set;}
    public int MaterialAssetId {get;set;}

    public virtual ICollection<ResidueHistory> Histories {get;set;}

    public Residue()
    {
        this.Histories = new List<ResidueHistory>();
    }
}

我需要添加一个方法,该方法将从作为参数传递的日期开始重新计算余额。

向类主体添加一个新方法

public void RecalculateResidueSince(DateTime since)
{
    throw new NotImplementedException();
}

Histories我决定实施的第一个测试是如果属性为空则退出方法;

在解决方案中添加了一个新的 UnitTest 项目:

[TestClass]
public class TestOfResidueMethods
{    
    [TestMethod]
    public void Test_RecalculateResidueForEmptyHistory()
    {        
        var residue = new Residue();
        residue.RecalculateResidueSince(DateTime.Now);
    }    
}

在这里,我对测试方法中的下一步做什么一头雾水,如果它是一个函数,那么我会检查结果是否符合我的预期。

告诉我如何测试,是否有必要为这样的方法编写这样的测试?

更新:

写完这个方法后,我修改了被测方法如下:

public void RecalculateResidueSince(DateTime since)
{
    if(!this.Histories.Any())
        return;
}

那些。如果实际上没有残留物,则分别什么也不做,但我不知道如何在测试中检查它

c#
  • 2 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-09-01 13:15:01 +0000 UTC

实体框架:如何从数据库中删除条目?

  • 1

该项目使用实体框架版本 6.1.3。

在不同的来源中,我看到了多种从数据库中删除条目的方法:

  1. 将对象标记为已删除:_context.Entry(obj).State = EntityState.Deleted;
  2. 使用方法Remove():_context.Set<T>().Remove(obj);

在这两种情况下,删除都会在下次调用该方法时发生。SaveChanges()

我试图找到这些方法之间的区别:我找不到任何可以理解的东西。

告诉我在什么情况下习惯使用一种或另一种方法,也许有一些细微差别/建议?

entity-framework
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-08-26 13:46:39 +0000 UTC

如何测试使用数据库的方法?

  • 19

在我的应用程序中,我使用实体框架版本 6.1.3 来处理mssql数据库。

有一个用测试覆盖你的代码的问题。

请告诉我如何测试这个包。

我想到创建一个本地测试数据库,在这个数据库上填充数据和测试方法,通过这种方法,我可以测试数据检索方法和CRUD方法。

我还听说,为了测试使用数据库的方法,您可以创建一个generic存储库public interface IRepository<T> where T: class { } ,并且为了测试,滑动fake一个包含测试数据的存储库。

到目前为止,我更倾向于第一种情况,即 创建一个本地测试数据库,该数据库将受到与真实数据库相同的更改(由于 ef 中的迁移机制)。

告诉我我描述的测试方法的正确性如何?我很想听听其他方法。

c#
  • 4 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-08-24 17:15:14 +0000 UTC

如何根据一定条件正确形成观点?

  • 1
public class DocumentDetails
{
    public int Id {get;set;}
    public int TypeId {get;set;}
    //Прочие свойства
}
public class AddDocumentItem
{
    public int DocumentId {get;set;}
    public int MaterialAssetId {get;set;}
    public decimal Amount {get;set;}
    public decimal Price {get;set;}
}

上述类用作强类型分部视图的模型。

根据文档类型 ( TypeId),我需要显示/隐藏输入价格的字段。

我可以想到 2 种可能的方法来实现这个要求:

  1. 创建 2 个局部视图并在主视图中解析文档类型并呈现必要的一个,即 就像是@if(Model.TypeId==условие){@Html.Partial("Первое представление")}else{@Html.Partial("Второе представление")}
  2. 在模型类中,为分部视图AddDocumentItem添加一个字段DocumentTypeId,为该字段添加一个检查条件(@if(Model.DocumentTypeId==условие){})
    2.1.将文档类型值写入 ViewBag.DocumentTypeId 中,在分部视图中解析

但在我看来,这两种选择都不太符合 MVC 的精神:在这两种情况下,视图中都有一些逻辑(需要显示哪个部分视图;显示或不显示输入字段)。

我更倾向于第二种选择,因为在这种情况下只有1 个而不是2 个局部视图(也就是说,至少不会有重复),但我不喜欢这种情况,我将不得不拖动文档类型到模型中。

也许还有其他方法可以解决我提出的问题,一些行之有效的做法/建议?

c#
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-08-19 15:20:04 +0000 UTC

如何确定页面的那部分发生了变化?

  • 0

有一个由几个部分视图组成的视图,在其中一个部分视图中,有必要连接第三方插件,该插件在主视图中初始化,一切正常,直到该插件所在的页面部分声明是使用ajax请求更新的。

告诉我如何找到原始页面的部分已更改并重新连接我需要的插件

PS使用的包:

package id="jQuery" version="2.2.0" targetFramework="net452"
package id="Microsoft.jQuery.Unobtrusive.Ajax" version="3.2.3" targetFramework="net452"

javascript
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-08-11 13:49:34 +0000 UTC

空集合的 `All()` 方法返回 `true`:错误还是功能?

  • 7

我有一个类Item

public class Item
{
    public int ParentId {get;set;}
    public int TypeId {get;set;}
    public int? AttachedFileId {get;set;}
}

我有必要为每个父母接收这种或那种类型的存在标志。item没有附件的存在被认为是不存在,写了以下请求:

var items = _context.Set<Items>()
    .GroupBy(x=>x.ParentId)
    .Select(x=>new
    {
        ParentId = x.Key,
        Type1 = x.Where(x=>x.TypeId==1).Any() && x.Where(x=>x.TypeId==1).All(x=>x.AttachedFileId!=null)
        //И так для каждого типа
    })

请求返回我需要的数据,但我觉得条件 x.Where(x=>x.TypeId==1).Any() && x.Where(x=>x.TypeId==1).All(x=>x.AttachedFileId!=null)可以改写

这也让我感到困惑,All空集合的方法返回true

小提琴的例子

c#
  • 1 个回答
  • 10 Views
Martin Hope
Bald
Asked: 2020-07-29 18:01:48 +0000 UTC

代码优化:在控制器中创建“通用”操作方法

  • 1

我有以下类层次结构

public abstract class OperationItemViewModel
{
    public int Id {get;set;}
    public int OperationId {get;set;}
    public int OperationItemTypeId {get; protected set;}
    //Прочие свойства
}

public class ProgramViewModel : OperationItemViewModel
{
    public ProgramViewModel() { this.OperationItemTypeId = 6;}       
}

public class SetupMapViewModel : OperationItemViewModel
{
    public SetupMapViewModel() { this.OperationItemTypeId = 3;}       
}

和下一个控制器

public class OperationController: Controler
{
    public ActionResult AddProgram(int operationId){}

    [HttpPost]
    public ActionResult AddProgram(ProgramViewModel model, HttpPostedFileBase downloadableFile)
    {
        if(ModelState.IsValid)
        {
            _operationService.AddItem(model);
        }
    }

    public ActionResult AddSetupMap(int operationId){}

    [HttpPost]
    public ActionResult AddSetupMap(SetupMapViewModel model, HttpPostedFileBase downloadableFile)
    {
        if(ModelState.IsValid)
        {
            _operationService.AddItem(model);
        }
    }
}

方法签名AddItem如下所示:

public void AddItem<T>(T item) where T: OperationItemViewModel
{
    var operationItem = //преобразовываем `ViewModel` в `DAO`
    _context.Set<OperationItem>().Add(operationItem);
    _context.SaveChanges();
}

在我的例子中,一切正常,但我不喜欢 Add( Program/SetupMap/... ) 方法主要是复制粘贴。

是否有可能以某种方式优化此代码 - 即 摆脱方法内部的重复?

c#
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5