给定属性类型的选项的特征之一是它是否“可搜索”。在属性可搜索的情况下,我可以使用它的值与其类型名配对来搜索/过滤我的产品。因此,例如,用户可能希望返回属性类型“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¶meters[0].Value=Trucks¶meters[1].Key=Manufacturer¶meters[1].Value=Ford
. 这不仅很难看,而且它的实现也非常有限,因为对URL的任何修改都可能破坏整个结果集(如果用户希望通过修改URL来搜索第二个参数,那么他们必须删除第一个参数并对整个集合进行适当的重新编号)。
我要找的是更好的方法来处理这种情况。理想情况下,我只希望有一个querystring值
?Category=Red
并进行相应的过滤,但是我的操作方法不知道是否有一个“Category”参数要绑定到。在这两者之间有没有什么能让我拥有更干净的querystring参数,而这些参数不会导致如此糟糕的URL结构?