代码之家  ›  专栏  ›  技术社区  ›  Nathan Taylor

ASP.NET MVC-清理复杂模型绑定场景中的URL

  •  0
  • Nathan Taylor  · 技术社区  · 16 年前

    给定属性类型的选项的特征之一是它是否“可搜索”。在属性可搜索的情况下,我可以使用它的值与其类型名配对来搜索/过滤我的产品。因此,例如,用户可能希望返回属性类型“Category”等于“Trucks”、属性类型“Color”等于“Red”的所有产品。没有什么特别的。

    我要处理的问题是,因为我的系统不能提前知道我的属性类型名称是什么,所以我不能轻松地创建一个操作方法,以可读的格式接受参数,比如 string category string color . 作为一个解决方案,我使用了DefaultModelBinder对绑定到字典的支持。使用这种方法,我只需要将字段名格式化为正确的结构,然后我的操作方法就可以接受 IDictionary<string,string> parameters

    <input type="hidden" name="parameters[0].Key" value="Category" />
        <select name="parameters[0].Value">
        <option value="Trucks">Trucks</option>
        <option value="Compacts">Compacts</option>
        <option value="SUVs">SUVs</option>
    </select>
    <input type="hidden" name="parameters[1].Key" value="Manufacturer" />
    <select name="parameters[1].Value">
        <option value="Ford">Ford</option>
        <option value="Toyota">Toyota</option>
        <option value="Honda">Honda</option>
    </select>
    

    这不仅是令人难以置信的冗长,而且由于每个键/值必须在字段名中包含一个顺序索引这一事实也有些令人沮丧。尽管这对于POST表单来说是可以接受的,但在GET URL中并不是特别理想,因为我们最终得到的URL类似于 ?parameters[0].Key=Category&parameters[0].Value=Trucks&parameters[1].Key=Manufacturer&parameters[1].Value=Ford . 这不仅很难看,而且它的实现也非常有限,因为对URL的任何修改都可能破坏整个结果集(如果用户希望通过修改URL来搜索第二个参数,那么他们必须删除第一个参数并对整个集合进行适当的重新编号)。

    我要找的是更好的方法来处理这种情况。理想情况下,我只希望有一个querystring值 ?Category=Red 并进行相应的过滤,但是我的操作方法不知道是否有一个“Category”参数要绑定到。在这两者之间有没有什么能让我拥有更干净的querystring参数,而这些参数不会导致如此糟糕的URL结构?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Craig Stuntz    16 年前

    我更喜欢你的“干净”URI: ?Category=Red

    您可以在运行时加载所有类别,对吗?在我的脑海里:

    IEnumerable<string> allCategories = Categories.GetAll();
    var usedCategories = Request.QueryString.AllKeys.Intersect(allCategories);
    var search = from c in usedCategories
                 select new 
                 {
                     Key = c,
                     Value = Request.QueryString[c]
                 };
    

    推荐文章