包含相同参数的ViewResult和ActionResult出错

时间:2011-01-15 05:54:13

标签: c# asp.net asp.net-mvc overloading

在我的控制器中,我有一个Edit GET方法来显示视图,还有一个Edit POST方法来保存更改:

public ViewResult Edit(int id)
{
    //
}

[HttpPost]
public ActionResult Edit(int id)
{
    //
}

但是我收到一个错误说:

类型'Controllers.MyController'已经定义了一个名为'Edit'的成员,其参数类型相同

我该如何解决这个问题?

7 个答案:

答案 0 :(得分:5)

您可以实现视图模型,以便包含希望用户能够编辑的所有字段的EditViewModel,并在Edit GET方法中返回该字段,并为视图模型提供强类型视图。那意味着在你的POST方法中你将EditViewModel作为参数传递,有点像这样:

[HttpGet]
public ViewResult Edit(int id)
{
    //build and populate view model
    var viewModel = new EditViewModel();
    viewModel.Id = id;
    viewModel.Name = //go off to populate fields

    return View("", viewModel)
}

[HttpPost]
public ActionResult Edit(EditViewModel viewModel)
{
    //use data from viewModel and save in database
}

所以你的GET和POST方法会有不同的签名。希望这会有所帮助。

答案 1 :(得分:3)

你必须阅读关于函数重载的这个(3.6 Signatures and overloading)。

功能重载

  

在这种方法中,您可以使用两个或多个具有相同名称的函数。但是   每个功能必须有不同   签名(即不同类型的   参数,参数序列或   参数数量。)

     

注意:返回类型不是参数的签名

在您的代码中,您已经实现了具有相同名称和签名的两个函数。

答案 2 :(得分:2)

对于另一个不太优雅的解决方案,想象一个网站具有“类似向导”的页面结构(视图),您希望将ViewModel从第1页传递到第2页,从第2页传递到第3页等。 / p>

问题在于,“GET”版本需要从第1页接收模型,但在进行回发时还需要将模型传递给第3页。因此,任何“中间”页面的GET和POST版本都需要包含模型的签名。

解决方法是简单地在签名中添加“垃圾参数”,确保使用?可以为空。

    [HttpGet]
    public ActionResult Page2(MyModel myModel)
    {
    }

    [HttpPost]
    public ActionResult Page2(MyModel myModel, int? i)
    {
    }

答案 3 :(得分:1)

它因为你将同一个参数传递给两个不允许的函数,尽管你在一个函数上指定了HttpPost。您可以更改Edit Post函数的名称并在Html.BeginForm()中指定它,或将参数更改为FormCollection而不是int

答案 4 :(得分:0)

我认为最简单的方法是在 global.asax.cs 文件中添加一个额外的可选参数:

new { controller = "Home", action = "Index", id = UrlParameter.Optional, id2 = UrlParameter.Optional } // Parameter defaults

并从

更改您的第二个功能
[HttpPost]
public ActionResult Edit(int id)

[HttpPost]
public ActionResult Edit(int id, int id2)

这样您就不必更改任何逻辑。由于第二个参数是可选的。如果你没有提供价值,它不会抱怨。

答案 5 :(得分:0)

如果在POST控制器方法上使用View Model,请确保您的模型具有空构造函数。这让我疯了。

namespace app.Models
{
    public class UserEdit
    {
        public User User { get; set; }

        public UserEdit() { }
    }
}

答案 6 :(得分:0)

您可以尝试这样做。

    public ActionResult Edit()
    {
        return View();
    }

    [HttpPost]
    [ActionName("Edit")]
    public ActionResult EditPosted()
    {
        return View();
    }