【问题标题】:ASP.NET MVC - How do action names affect the url?ASP.NET MVC - 操作名称如何影响 url?
【发布时间】:2010-09-07 11:53:26
【问题描述】:

使用开箱即用的 MVC,我发现生成的 URL 可能会产生误导,我想知道这是否可以解决,或者我的方法/理解是否错误。

假设我有一个 CreateEgg 页面,上面有一个表单,一旦表单被填写并提交,用户就会被带到一个 ListEggs 页面,其中包含新的鸡蛋。

所以我的鸡蛋控制器看起来像这样:

public class EggController : Controller
{
    public void Add()
    {
        //do stuff

        RenderView("CreateEgg", viewData);
    }

    public void Create()
    {
        //do stuff

        RenderView("ListEggs", viewData);
    }
}

所以我的第一页会有一个类似http://localhost/egg/add 的网址,并且页面上的表单将有一个动作:

using (Html.Form<EggController>(c => c.Create())

意思是第二页会有一个http://localhost/Egg/Create 的url,对我来说这是误导,这个动作应该被称为Create,因为我正在创建鸡蛋,但是一个列表视图正在显示,所以http://localhost/Egg/List 的url 会制作更多场景。如何在不误导视图或操作名称的情况下实现这一目标?

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    问题是你的行为做了两件事,违反了单一职责原则。

    如果您的 Create 操作在完成创建项目后重定向到 List 操作,那么这个问题就会消失。

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        Scott Gu 的 post 中概述的 ActionVerbs 似乎是一个不错的方法;

        斯科特说:

        你可以创建重载的 动作方法的实现,以及 使用新的 [AcceptVerbs] 属性 有 ASP.NET MVC 过滤器它们是怎样的 派出。例如,下面我们可以 声明两个 Create 操作方法 - 将在 GET 中调用的 场景,一个将被称为 在 POST 场景中

        [AcceptVerbs("GET")]
        public object Create() {}
        [AcceptVerbs("POST")]
        public object Create(string productName, Decimal unitPrice) {}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          相关资源
          最近更新 更多