在我的控制器中,我有一个Edit GET方法来显示视图,还有一个Edit POST方法来保存更改:
public ViewResult Edit(int id)
{
//
}
[HttpPost]
public ActionResult Edit(int id)
{
//
}
但是我收到一个错误说:
类型'Controllers.MyController'已经定义了一个名为'Edit'的成员,其参数类型相同
我该如何解决这个问题?
答案 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();
}