如何从多个字段生成ASP.NET MVC slugs?

时间:2010-10-23 01:52:34

标签: asp.net-mvc

我的网址应如下所示:localhost/Products/Details/1/asus-intel-core-2-duo

如您所见,slug是从现有字段生成的:brand-processorBrand-ProcessorModel。我的标题也将如此,没有破折号。我在我的服务层中生成了这个slug。我有两个问题:

  1. 我应该在何处以及如何存储此格式,以便我可以更改一次,其他所有内容都会更改?即。 {brand} {processorBrand} {ProcessorModel}

  2. 如何生成字符串?我只知道:string.Format("{0} {1} {2}", Model.Brand, Model.ProcessorBrand, Model.ProcessorModel)。这似乎不适用于将格式存储在其他地方的情况。


  3. 如果我错了,我还有另一种方法。但这需要我遍历服务层中的每个产品,并在产品类上调用一个生成标题和slug的方法。例如。

    public class Product
    {
        public void GenerateStuff();
        //Other properties here...
    
        public string Title {get; set;};
        public string Slug {get; set;};
    }
    

    我知道有更好的方法可以做到这一点,我所拥有的每一种方法都显得非常混乱。

3 个答案:

答案 0 :(得分:0)

无论你怎么做,它看起来都会涉及反射,这似乎是一个性能瓶颈。必须循环遍历模型上的每个属性似乎需要做很多次才能完成的工作。

国际海事组织,这是一个足够大的改变,而且不应该经常发生,我不会把它存储在任何地方。我会让代码在一个地方生成这个字符串,当它需要更改时,更改它,并重新构建应用程序。

答案 1 :(得分:0)

生成slug本身不属于Product或任何其他域类。这与如何格式化slug,安全URL编码,允许字符等问题有关。 [顺便说一句,单独使用string.format不足以从域对象属性创建正确的URL编码字符串]。

因此,将slug生成方法保留在服务层中,但可能会将其更改为接受字符串值的枚举。

您的域对象类可以使用类似

的方法返回字符串值
public IEnumerable<string> SlugValues {get {return new []{this.Brand, this.ProcessorModel} };

另一种方法是将属性添加到类或其中的属性,以表示在slug生成中使用哪些属性。现在,您可以使用反射找到要使用的内容。

答案 2 :(得分:0)

我们还需要唯一的URL slugs。

我们在数据库端做这个,使用触发器(是的,我知道触发器是邪恶的,裸露在我身边)

我们的产品实体有一个名为UniqueUri的属性,该属性可以为空,并在首次创建产品时插入NULL。

然后我们在Products表上有一个INSERT / UPDATE触发器来生成唯一的URI。

触发器基本上查看所有现有产品,并且(使用某些逻辑/魔术)更新唯一URI。

这个(IMO)是这个逻辑所属的地方,并且是触发器的好例子。通过UI添加产品时,UI不必等待来创建URI。这样,它就是异步完成的(在某种意义上,至少从请求的角度来看)。

使用SQL循环遍历所有产品比在.NET中循环快得多。