【问题标题】:Need help designing to ASP.NET MVC action methods需要帮助设计 ASP.NET MVC 操作方法
【发布时间】:2011-04-16 20:59:46
【问题描述】:

我刚开始学习 ASP.NET MVC 3。我一直在浏览 ASP.NET 网站上的音乐商店示例,并开始开发自己的网站,但我遇到了一些麻烦了解我应该如何设置我的控制器操作方法。

在我的网站上,每个登录的用户都可以在他们的项目上执行标准的 CRUD 操作。我在 ProjectController 上使用以下操作方法将其设置为类似于 Music Store 示例。到目前为止,这对我来说是有意义的。

ActionMethod                                          View
ProjectController.Index()                            Lists the active users's projects
ProjectController.Details(int id)                    Shows details for project 123
ProjectController.Create()                           Shows a form to edit a new project
ProjectController.Create(FormCollection col)         Adds a new project with the form contents
ProjectController.Edit()                             Shows a form to edit a new project
ProjectController.Edit(int id, FormCollection col)   Adds a new project with the form contents
ProjectController.Deiete(int id)                     Shows a delete confirmation form
ProjectController.Delete(int id, FormCollection col) Deletes a project with the provided id.

此外,用户将能够向每个项目添加项目。项目不能单独存在,必须在创建时与项目相关联。我难以理解的是如何传递对应该在其中创建项目的项目的引用。例如,在我的项目控制器中,我有一对类似于上述控制器的 Create() 操作方法。

ItemController.Create()                               Shows a form to create a new item
ItemController.Create(FormCollection col)             Creates a new item with the details from the form.

但我不明白第一个 Create() 方法如何将引用传递给应在其中创建新项目的项目,因为 View() 辅助方法只能接受一个对象参数。我应该只将项目的引用添加到 ViewBag 的属性中吗?我也是动态类型的新手,此时 ViewBag 对我来说似乎很神奇。所以我有点犹豫要不要使用它。我也一直认为强类型设计更好。那么我应该创建一个单独的“NewItemData”模型对象,其中包含对新项目的引用以及它要添加到的项目吗?

一旦表单知道它正在向哪个项目添加项目,它应该如何在提交时将这些信息传回?表单中是否应该有一个隐藏的“ProjectID”字段?还是应该将表单 POST 返回到查询字符串中包含项目 ID 的 URL?

www.mysite.com/Item/Create?ProjectID=1234 

最后,我还希望能够列出添加到每个项目中的项目。这应该是 ItemController 还是 ProjectController 的一部分。为简单起见,我坚持使用默认的 Controller\Action[ID] URL 路由。下面列出了我的一些想法。我倾向于最后一个选项,但真的很想听听其他有更多经验的人的想法。

Action Method                          URL
ItemController.Index(int ProjectID)    \Item?ProjectID=1234    
ItemController.List(int id)            \Item\List\1234         
ProjectController.Items(int id)       \Project\Items\1234

【问题讨论】:

    标签: asp.net asp.net-mvc actionmethod


    【解决方案1】:

    要回答您的最后一个问题,这取决于。模型中的项目是否独立于项目而存在?如果答案是否定的,那么我会倾向于这样做

    ProjectController.AddItem(int id)
    ProjectController.Items(int id)
    

    其中 id 表示项目 ID。

    您在动作签名中使用的参数名称直接对应于路由数据和请求值中的值。 {controller}/{action}/{id} 是一种使用大括号名称作为路由字典中的键的模式。如果您愿意,您可以将路线更改为该操作的 {controller}/{action}/{projectid} 并且您的方法签名可以是(int projectid)签名。

    我不建议您这样做只是为了获得很棒的签名。如果您认为人们会感到困惑,请改用 cmets。

    在不更改路由模式的情况下,如果您希望您的网址是 /project/items?projectid=3 而不是 /project/items/3,那么操作将是这样的:

    ProjectController.Items(int projectId)
    

    我喜欢更漂亮的 url,所以我更倾向于使用 id 版本。话虽如此,如果 Items 不独立于 Project 对象存在,我更有可能这样做。但是,如果您要对一个 Item 执行大量不同的操作,则将它们分成 ItemController 和 ProjectController 是有意义的。

    这在很大程度上取决于什么对您的应用程序有意义,以及您认为控制器应该对其执行多少操作。

    【讨论】:

    • 是的,你是对的,没有项目就不能存在项目,所以你的例子很有意义。尽管我认为仍然有一个单独的 ItemController 用于 Item 特定操作(例如查看 Item 详细信息或编辑和 Item)可能也是有意义的。而是将创建和删除项目留给项目控制器,因为实际上我总是在项目中添加或删除项目。
    【解决方案2】:

    在这种情况下,您将使用 name=projectId 创建一个隐藏字段,然后在您的 Create 控制器中有一个操作方法。

    [HttpPost]
    public ActionResult Create( int projectId, FormCollection postData )
    

    通常您还会使用强类型视图模型,因此使用 FormCollection 参数:

    [HttpPost]
    public ActionResult Create( int projectId, Item or ItemViewModel postData )
    

    只要 name 属性与 Item 或 ItemViewModel 中的属性匹配,MVC 的 ModelBinder 就会处理这些值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多