【问题标题】:How to get multiple or single values in text?如何在文本中获取多个或单个值?
【发布时间】:2021-06-23 08:50:38
【问题描述】:

我有一个搜索模型。

public class Search{
  public string SearchId{ get; set;}
}

我在我的 asp.net mvc action fo 控制器中得到了这个

[HttpPost]
public ActionResult Search(Search search){
...
...
}

当用户在文本框中设置 ID 值时,我正在使用实体框架进行搜索。

但我的客户想要搜索多个以逗号分隔的 ID,如下所示

  1,2,3,4,5

所以我想了解 SearchId 值是多个还是单个。那我怎么理解?使用模式测试还是其他方式?

【问题讨论】:

  • public ActionResult(Search search){ 这不是有效的语法!您缺少方法名称。
  • 是更新了方法名
  • 您能否提供有关 SearchId 的更多详细信息?它是包含逗号分隔整数的字符串(例如“1”或“1,2,3,4”)还是可以包含其他内容?

标签: c# .net asp.net-mvc


【解决方案1】:

您可以将搜索更改为类似字符串,并将它们拆分为整数数组:

[HttpPost]
public ActionResult Search(string search)
{
    int[] ints = search.Split(',').Select(int.Parse).ToArray();
    
    var results = from customer in context.Customers
            where ints.Contains(customer.Id)
            select customer;

    //todo: handle results
}

如果数组中只有一个 ID,应该没有区别。

【讨论】:

  • 请注意,这只适用于少数“整数”。
  • 问题应该是,你为什么要让你的用户搜索 ID :-)
  • 同意。这也是一个有效的问题。
  • 他们通过邮件或 excel 表格从外部来源获取多个 ID。所以他们想通过在文本框中输入所有的id值来搜索,而不是一一搜索。
  • @barteloma 好的。但是请注意,这将被转换为“WHERE IN (...)”,它可以容纳最多的项目(这是惊人的低),并且项目越多,它的性能就越差。我不是说“不要这样做”。如果 id count > N,只需检查您是否要切换到不同的方法。也许它甚至不适用于您,因为您得到 max ... idk 10 ids 左右。但是我会确保只允许一定数量的 id 最大值(不要相信用户输入)。
【解决方案2】:

试试这个:

[HttpPost]
public ActionResult Search(Search search){
    var numbers = search.SearchId.Split(',').Select(Int32.Parse).ToList();
    
    //to understand the SearchId value if multiple or single
    if(numbers.Count == 1){
       // SearchId value is single
    }
    else if(numbers.Count > 1)
   //SearchId value has multiple value
}

【讨论】:

  • OP:对于生产就绪版本,您可能还需要考虑空字符串 (string.IsNullOrWhiteSpace) 和解析错误。永远不要相信用户输入。
【解决方案3】:

如果您只需要了解 SearchId 值是多个还是单个,您可以将 SearchId 通过“,”拆分为数组并检查数组长度(但我不会说这是最好的解决方案)。

[HttpPost]
public ActionResult Search(Search search){
   var ids = search.SearchId.Split(",", StringSplitOptions.RemoveEmptyEntries);
   bool isMultiple = ids.Length > 1;

}

但如果您的 SearchId 仅包含一个逗号分隔的整数字符串,则有更好的方法。首先,您需要将合同从

public ActionResult Search(Search search)

public ActionResult Search(int[] ids)

因为它简化了流程,您不需要将 SearchId 字符串拆分为子字符串数组,然后将数组的每个元素解析为整数。在这种情况下,您应该了解您正在尝试解析来自用户的输入,并且您可能会在输入字符串中得到无法解析为整数的内容(例如,“1,2,3,e, t") 并且您需要通过 try-catch 块包装 int.Parse 或使用 int.TryParse。 另一件事可能是您总是返回和数组作为搜索响应,如果用户传递单个 id 或多个 id,您无需担心,因为您总是返回一个数组,如果您返回一个元素或一个元素的数组,则没有区别数组或多个元素

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多