2010-10-23 41 views
2

我的網址應該是這樣的:localhost/Products/Details/1/asus-intel-core-2-duo如何從多個字段生成ASP.NET MVC slugs?

正如您所見,slug是從現有字段生成的:brand-processorBrand-ProcessorModel。我的標題也是這樣,沒有破折號。我在我的服務層生成這個slu slu。我有2個問題:

  1. 我應該在哪裏以及如何存儲這種格式,這樣我就可以改變它,一切都改變了?即。 {brand} {processorBrand} {ProcessorModel}

  2. 如何生成字符串?我只知道:string.Format("{0} {1} {2}", Model.Brand, Model.ProcessorBrand, Model.ProcessorModel)。在其他地方存儲格式的情況下,它似乎不可行。


如果我要對這個錯誤,我心裏有另一種方法。但是這需要我循環遍歷服務層中的每個產品,並調用產生類標題和slug的產品類的方法。例如。

public class Product 
{ 
    public void GenerateStuff(); 
    //Other properties here... 

    public string Title {get; set;}; 
    public string Slug {get; set;}; 
} 

我知道有一個更好的方法來做到這一點,我看到的每種方法都很混亂。

回答

0

生成slug本身不屬於Product或任何其他域類。這與如何格式化slu issues,安全URL編碼,允許字符等相關的問題相關。 [順便說一句,string.format顯然不足以從你的域對象屬性中創建一個合適的URL編碼的字符串]。

因此,請在您的服務層中保留slug生成方法,但可以將其更改爲接受字符串值的枚舉。

你的域對象類可以像這樣

public IEnumerable<string> SlugValues {get {return new []{this.Brand, this.ProcessorModel} }; 

的方法的替代方法是屬性添加到您的類或者在它的屬性來表示在使用哪些返回字符串值塞代。現在你可以找到使用反射的那些。

0

不管你怎麼做,它看起來都會涉及反射,這看起來好像是性能瓶頸。不得不循環遍歷模型中的每個屬性對於將要做很多次的事情來說似乎是很多工作。

國際海事組織,這是一個足夠大的變化,不應該太頻繁,我不會存儲在任何地方。我會讓代碼在一個地方生成這個字符串,當它需要改變時,改變它,並重新構建應用程序。

0

我們還需要獨特的URL段落。

我們這樣做是在數據庫方面,使用觸發器(是的,我知道觸發器是邪惡的,裸與我)

我們產品實體有一個名爲UniqueUri屬性,它是空的,並且被插入產品首次創建時爲NULL。

然後我們在產品表上有一個INSERT/UPDATE觸發器來生成唯一的URI。

觸發器基本上查看所有現有的產品,並且(用一些邏輯/魔術)更新唯一的URI。

這個(IMO)是這個邏輯所屬的地方,並且是觸發器的好例子。當您通過用戶界面添加產品時,用戶界面不需要等待以創建URI。這樣,它是異步完成的(從某種意義上說,至少從請求的角度來看)。

使用SQL循環遍歷所有產品比在.NET中執行循環要快得多。

+0

這種類型的邏輯屬於您的業務/服務層,而不是您的數據庫/存儲庫。 – 2011-03-17 15:59:12