ASP.NET MVC url的构建

ASP.NET MVC url的构建,asp.net,asp.net-mvc,url,Asp.net,Asp.net Mvc,Url,在我提问之前:我刚刚启动了ASP.NET MVC,所以高级答案可能很难理解;) 我有3个表(我只添加下面的几个字段) 商店(ShopID、名称) 产品(ProductID、名称、ShopID) 注释(CommentID、ProductID、UserID、CommentText) 现在我想做的是: www.site.com/Shops //给我一张商店的名单 www.site.com/Shops/ShopName //给我一些有关ShopName商店的详细信息,并列出该商店所有的产品 www.

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

我有3个表(我只添加下面的几个字段)

  • 商店(ShopID、名称)
  • 产品(ProductID、名称、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/是否有好处。如果中间没有细节部分,也许/Shops/ShopName会更好

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

提前谢谢


(还有一个简短的问题,ViewModels是否应该放在controllers目录中?

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


我不知道官方对ViewModels应该位于何处的立场。这实际上取决于您,取决于您正在实现的ORM方法。我正在使用LINQtoSQL,玩得很开心。我将LINQ to SQL模型保存在我的Models文件夹中。我更喜欢将视图模型保存在“模型”文件夹下的视图子文件夹中。我还拥有一个域子文件夹,用于保存实体的部分模型,以防我要实现计算字段或设置记录的初始值。

有点像做你的工作,但是-不管怎样。
我会用这样的东西(警告-这是未经测试的)

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

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/=>

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(NB:对于每个控制器,此路线是“全局的”)=>

也许这可以优化或更糟-这是错误的,但它肯定会给你一些更好的理解

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

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

另一个技巧-阅读有关模型绑定的内容。使用自定义绑定器,您可以用实际的、已组装的对象替换字符串参数(实体名称)。在这种情况下,这可能不值得,但在面对asp.NETMVC时,模型绑定无疑是第二重要也是最难掌握的东西

我撒谎说,我不会这么做,因为我更喜欢直接在动作上使用属性来指定特定于控制器的路由(省略它是因为它看起来更高级)

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



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

简短的回答——最好不要。在web应用程序项目中创建短文件夹“Model”:哦很高兴看到它确实有所帮助!:)
routes.MapRoute(
    "List",
    "{controller}",
    new { action = "list"}
);