如何搜索mvc3中单个文本框中输入的多个字符串

时间:2012-03-21 16:01:57

标签: asp.net-mvc-3 nhibernate

我有一个名为Keywords的文本框。 用户可以输入多个字符串进行搜索。 如何在mvc3中实现这一点? 我使用nhibernate作为ORM。 我可以为此创建标准吗?

已编辑的方案

我根据以下值部分查看工作

  • 关键字(多个字符串),行业(带功能区的级联下拉列表)//运行良好,FunctionalArea //运行良好 Loaction(多个位置),体验//运作良好

控制器中,我从表单集合中检索这些值。 我应该为关键字和位置使用什么数据类型(字符串或字符串[])?

   public ActionResult SearchResult(FormCollection formCollection)
            {
    IList<Jobs> JobsSearchResultList = new List<Jobs>();
                //string[] keywords = null;            
                string location = null;
                int? industry = 0;
                int? functionaArea = 0;
                int? experience = 0;
                string keywords = null;

                if (formCollection["txtKeyword"] != "")
                {
                    keywords = formCollection["txtKeyword"];
                }
                //if (formCollection["txtKeyword"] != "")
                //{
                //    keywordAry = formCollection["txtKeyword"].Split(' ');
                //    foreach (string keyword in keywordAry)
                //    {
                //        string value = keyword;

                //    }                
                //}
......retrieving other values from formcollection
....

    //Now passing these values to Service method where i have criteria for job search
JobsSearchResultList = oEasyJobsService.GetJobsOnSearchExists(keywords,industry,functionaArea,location,experience);
        return View(JobsSearchResultList);
    }

服务中,我做了类似的事情:

public IList<EASYJobs> GetJobsOnSearchExists(string keywords, int? industryId, int? functionalAreaId, string location, int? experience)
{
IList<JobLocation> locationlist = new List<JobLocation>();
IList<Jobs> JobsList = null;
var disjunction = Expression.Disjunction();
ICriteria query = session.CreateCriteria(typeof(Jobs), "EJobs");
if (keywords != null)
        {

        foreach (string keyword in keywords)
        {
        string pattern = String.Format("%{0}%", keyword);
        disjunction
       .Add(Restrictions.InsensitiveLike("Jobs.keywords", pattern,MatchMode.Anywhere))
       .Add(Restrictions.InsensitiveLike("YJobs.PostTitle",pattern,MatchMode.Anywhere));
        }
       query.Add(disjunction)
            .Add(Expression.Eq("EASYJobs.Industry.IndustryId", industryId))
            .Add(Expression.Eq("Jobs.FunctionalArea.FunctionalAreaId", functionalAreaId))
            .Add(Expression.Eq("Jobs.RequiredExperience", experience)));
       }
else
{..
}
JobsList = criteria.List<Jobs>();
}

我面临的问题是:

  1. 在控制器中,如果我使用string [],则Split(',')不会使用指定的separator分割字符串。它会将字符串传递给Service。
  2. 2.在服务中我试图用%{0}%替换字符串,带有空格的字符串在这里用给定的分隔符替换/ concat()。 但这里的问题是它总是返回整个作业列表意味着没有提供所需的输出。 请求帮助...

2 个答案:

答案 0 :(得分:1)

只要你有一个分隔符,就可以将输入分成几部分,你应该可以创建一个包含这些部分的表达式。您可以使用析取来使用OR组合任意数量的条件。

var criteria = session.CreateCriteria<TestObject>();
Junction disjunction = Restrictions.Disjunction();

var input = "key words";
foreach (var keyword in input.Split(" "))
{
    ICriterion criterion = Restrictions.Eq("PropertyName", keyword);
    disjunction.Add(criterion);
}
criteria.Add(disjunction);

答案 1 :(得分:0)

具有特殊字符或额外空格的多个关键字将使用Regex表达式替换为单个空格。 然后使用Split(“”)分隔关键字。 它按要求工作....

if (!string.IsNullOrEmpty(keywords))
                {
                    keywords = keywords.Trim();
                    keywords = System.Text.RegularExpressions.Regex.Replace(keywords, @"[^0-9a-zA-Z\._\s]", " ");
                    keywords = System.Text.RegularExpressions.Regex.Replace(keywords, @"[\s]+", " "); 

                    if (keywords.IndexOf(" ") > 0)
                    {
                        string[] arr = keywords.Split(" ".ToCharArray());
                        for (int i = 0; i < arr.Length; i++)
                        {
                            if (!string.IsNullOrEmpty(arr[i]))
                            {
                                criteria.Add(Restrictions.Disjunction()
                                 .Add(Expression.Like("EASYJobs.keywords", arr[i], MatchMode.Anywhere)));
                            }
                        }
                    }
                    else
                    {
                        criteria.Add(Restrictions.Disjunction()                      
                             .Add(Expression.Like("EASYJobs.keywords", keywords, MatchMode.Anywhere)));
                    }

                }