【问题标题】:How to search with parameters in MVC?如何在 MVC 中使用参数进行搜索?
【发布时间】:2010-06-13 15:07:42
【问题描述】:

我需要能够为最终用户提供一个页面,他们可以在其中进行以下搜索:

  • 搜索作品
  • 类别
  • 价格
  • 广告类型
  • 位置

等等。

重要的是用户可以复制 url,然后再使用它(并获得相同的设置)。能够将用户的这些设置保存在数据库中也很重要。

到目前为止,我已经创建了一个包含参数的 ModelView 类,但我不确定这是正确的方法吗?也许我应该传递所有的 URL。

如果是这样,我该如何做到这一点?有什么可以看的样本吗?

致以最诚挚的问候

【问题讨论】:

    标签: asp.net javascript jquery asp.net-mvc


    【解决方案1】:

    问题最少的方法是在queryString中传递参数。

    mysite.com/search/?c=1&p=1.00&at=blah&location=75081&.....
    

    这种方法与 MVC 无关。事实上,当传递与模型字段不对应的参数时,您可能会看到使用 QueryString 参数生成的 ActionLink。

    你可以创建一个类似的路线

    Search/{Category}/{Price}/{AdType}/{Location}/...
    

    但是,在我看来,这是错误的做法。我假设(可能是错误的)使用路由会使 URL 对搜索引擎更友好,但如果您希望外部搜索引擎可以发现不同的搜索 url 组合,这只是一个问题,这实际上并没有那么多感觉就像一个站点地图。

    更新:

    如果你这样声明你的行为:

    public ActionResult Search(string category, float price, string adType, float location)
    {
    /// do whatever you want in here
    }
    

    然后你的 queryString 参数将被映射到 action 方法参数。

    您需要做的就是将表单“方法”设置为 GET,

    <form method="GET" ....>
    

    让您的字段作为查询字符串参数而不是表单 POST 数据传递。

    【讨论】:

    • 所以你说的是我应该在提交时构造某种查询字符串,将我的所有参数都考虑在内。然后在服务器端,我将提取 quaryString 并针对注入攻击对其进行验证。当这有效时,我能够将正确的数据返回给客户端吗?我应该使用 queryString 并且只包含选择的参数还是应该使用路由?以及如何尽可能简单地构造查询字符串?
    • 将表单方法设置为“GET”将导致表单字段作为 queryString 参数而不是 POST 数据传递。您需要在您的操作方法中验证服务器上的数据。如果您正在搜索数据库,请使用存储过程来执行搜索,并使用像 Enterprise Library 这样的优秀库来调用存储过程,因为这将有助于防止注入。请参阅上面的更新。
    • 谢谢,但这是否意味着我必须在客户端以某种 javascript 函数提交时手动生成查询字符串?你有一个关于如何生成这个查询字符串的例子吗?
    • 否,将表单的方法类型设置为“GET”将导致在您点击按钮提交表单时生成查询字符串。
    • 这个评论区太小,无法在其中发布代码,所以我不得不发表任何帖子,见下文。
    【解决方案2】:

    抱歉,评论区太小了,无法使用。

    问题是我的网络方法看起来像这样:

    [AcceptVerbs(HttpVerbs.Post)]
            public ActionResult List(AdList adList)
            {
                try
                {
                    return View(adList);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
    

    广告列表如下所示:

    public class AdList
        {
            public AdList()
            {
                this.ModelViewAd = new List<ModelViewAdList>();
            }
    
            public List<ModelViewAdList> ModelViewAd { get; set; }
            public SeartchParameters ModelViewSeartchParameters { get; set; }
        }
    

    这就是成员的样子:

    public class SeartchParameters
        {
            public string SeartchString { get; set; }
            public int CategoryId { get; set; }
            public int MunicipalityId { get; set; }
            public int CountryId { get; set; }
        }
        public class ModelViewAdList
        {
            [DisplayName("Titel")]
            public string Titel { get; set; }
    
            [DisplayName("Köp ny pris")]
            public Decimal BuyNowPrice { get; set; }
    
            [DisplayName("Reservations pris")]
            public Decimal ReservationPrice { get; set; }
    
            [Required(ErrorMessage = "Annons text saknas")]
            [DisplayName("Annons text")]
            public string Description { get; set; }
    
            [DisplayName("Slutdatum")]
            public DateTime? EndDate { get; set; }
    
            [DisplayName("Frakt kostnad")]
            public Decimal Shipping { get; set; }
    
            [DisplayName("Produktens Skick")]
            public ProductStatus StateOfProduct { get; set; }
    
            [DisplayName("Start pris")]
            public Decimal StartingPrice { get; set; }
    
            [DisplayName("Annonstyp")]
            public RadioButtonListViewModel<AdType> TypeOfAd { get; set; }
        }
    

    如果我将 AdList 作为参数删除,然后将搜索参数广告改为广告,它可能无法正常工作,因为 MVC 正试图发回很多对象?

    那么我该如何结合大卫的例子来解决这个问题呢?

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2017-08-16
      • 2015-08-02
      相关资源
      最近更新 更多