代码之家  ›  专栏  ›  技术社区  ›  juFo

ASP.NET MVC URL构造

  •  0
  • juFo  · 技术社区  · 14 年前

    在我问我的问题之前:我刚启动了ASP.NET MVC,所以一个高级答案可能很难理解;)

    我有三张桌子 (我将在下面添加几个字段)

    • 商店(ShopID,名称)
    • 产品(productid、name、shopid)
    • 注释(commentid、productid、userid、commenttext)

    现在我想做的是:

    网址:www.site.com/shops

    //给我一张商店列表

    www.site.com/shops/shopname

    //给我一些关于商店ShopName的详细信息,并列出商店拥有的所有产品

    www.site.com/shops/shopname/productName网站/

    //给出特定商店ShopName中名为ProductName的产品的所有注释

    www.site.com/shops/shopname/productName/aspecificCommenthere

    //对那家商店的产品给出了具体的评论

    还有其他的事情

    www.site.com/shops/shopname/productName/addcomment网站

    //从该商店向该产品添加新注释

    现在我只有一个 商店控制器 这使得我现在可以这样做:

    网址:www.site.com/shops/

    //给我一张所有商店的清单

    网址:www.site.com/shops/details/123

    //提供了一些ID为123的商店的详细信息,应该列出它的产品。

    但这也是第一个问题:我不想在url中输入/shops/123这样的ID号,而是希望输入/shops/shopname这样的名称,我不知道在url中输入/details/t here是否好。如果没有中间的细节部分,也许/商店/商店名称会更好?

    我该怎么做? 我是否还应该为我的产品和评论创建一个控制器,总共有3个控制器? 或者我应该只保留一个ShopController来始终获取URL的第一部分(以便它总是以site.com开头)/ 商店/店名/

    提前谢谢

    (还有一个简短的问题,viewmodels应该放在控制器目录中吗?)

    2 回复  |  直到 11 年前
        1
  •  1
  •   Arnis Lapsa    14 年前

    善良的样子 你的 工作,但是-不管怎样。
    我会带着这样的东西去(被警告-它还没有经过测试)

    正如你可能已经知道的,秩序很重要。

    www.site.com/shops/shopname/productName/addComment=>

    routes.MapRoute(
        "Product",
        "Shops/{shopName}/{productName}/{action}",
        new { controller="comment"}
    );
    

    www.site.com/shops/shopname/productName/aspecificCommenthere=>

    routes.MapRoute(
        "Product",
        "Shops/{shopName}/{productName}/{commentName}",
        new { controller="comment", action="details"}
    );
    

    www.site.com/shops/shopname/productName/addproduct=>

    routes.MapRoute(
        "Product",
        "Shops/{shopName}/{productName}/{action}",
        new { controller="product"}
    );
    

    www.site.com/shops/shopname/productName/=gt;

    routes.MapRoute(
        "Product",
        "Shops/{shopName}/{productName}",
        new { controller="product", action = "details"}
    );
    

    www.site.com/shops/shopname=>

    routes.MapRoute(
        "ShopDetails",
        "Shops/{shopName}",
        new { controller="shop", action = "details"}
    );
    

    网址:www.site.com/shops( :此路由为“全局”,对于每个控制器)=>

    routes.MapRoute(
        "List",
        "{controller}",
        new { action = "list"}
    );
    

    也许这可以优化或者更糟-这是错误的,但它应该给你一些更好的理解。

    记住不要根据控制器操作来命名商店/控制器/注释。这是这种路由方法的一个问题。

    我希望您注意到,我将创建3个不同的控制器(什么可能是一个好的决定,也可能不是一个好的决定——这是基于控制器逻辑的可预期的权重和复杂性)。

    另一个技巧-阅读模型绑定。使用自定义绑定,可以将字符串参数(实体名)替换为实际的、已经组装的对象。对于这个特殊的情况,也许这是不值得的,但是当面对ASP.NET MVC时,模型绑定肯定是第二重要也是最难掌握的事情。

    我撒了谎,我不同意这样做,因为我更喜欢在操作上直接使用属性指定特定于控制器的路由(忽略了这一点,因为它看起来更多 advanced )

    路由就像正则表达式。有时它只是“咔嗒”一声,看起来自然而简单。


    已回答第二个问题作为对您问题的评论。:)

        2
  •  0
  •   Neil T.    14 年前

    我会花点时间研究MVC中的路由机制。这是为应用程序应该接收的URL设置格式的地方。您提到的所有事情都是可能的…您只需要相应地构造您的路由定义。只要能够接受实体的名称而不是ID,就可以很容易地通过构造路由来接受名称,并将操作方法上的签名更改为接受字符串而不是ints来做到这一点。

    我不知道视图模型应该位于哪里的官方立场。这取决于您自己,并且取决于您正在实现的ORM方法。我正在使用linq-to-sql,并且非常享受它。我将LINQ to SQL模型保存在我的模型文件夹中。我喜欢将视图模型保存在“我的模型”文件夹下的视图子文件夹中。我还有一个域子文件夹来保存我的实体的部分模型,以防我想实现计算字段或设置记录的初始值。