C# ViewResult和ActionResult包含相同参数时出错
在我的控制器中,我有一个Edit GET方法来显示视图,还有一个Edit POST方法来保存更改:C# ViewResult和ActionResult包含相同参数时出错,c#,asp.net,asp.net-mvc,overloading,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”的成员 如何解决这个问题?这是因为您将相同的参数传递给两个函数,这是不允许的,尽
public ViewResult Edit(int id)
{
//
}
[HttpPost]
public ActionResult Edit(int id)
{
//
}
但我有个错误说:
类型“Controllers.MyController”已经使用相同的参数类型定义了一个名为“Edit”的成员
如何解决这个问题?这是因为您将相同的参数传递给两个函数,这是不允许的,尽管您在其中一个函数上指定了HttpPost。您可以更改Edit Post函数的名称并在Html.BeginForm()中指定它,或者将参数改为FormCollection而不是int您必须阅读此()关于函数重载的内容 函数重载 在这种方法中,可以有两个或多个同名函数 每个函数必须具有不同的 签名(即不同类型的签名) 参数、参数序列或 参数数量) 注意:返回类型不是参数的签名
在您的代码中,您已经使用相同的名称和签名实现了这两个函数。您可以实现视图模型,这样您就拥有了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方法将具有不同的签名。希望这能有所帮助。对于另一个不那么优雅的解决方案,设想一个具有“向导式”页面(视图)结构的站点,您希望将ViewModel从第1页传递到第2页,从第2页传递到第3页等等 问题是第2页的“GET”版本需要从第1页接收模型,但在回发时还需要将模型传递到第3页。因此,任何“中间”页面的GET和POST版本都需要包含模型的签名 一种解决方法是简单地向签名添加一个“垃圾参数”,通过使用?确保它可以为null
[HttpGet]
public ActionResult Page2(MyModel myModel)
{
}
[HttpPost]
public ActionResult Page2(MyModel myModel, int? i)
{
}
我认为最简单的方法是在global.asax.cs文件中添加一个额外的可选参数:
new { controller = "Home", action = "Index", id = UrlParameter.Optional, id2 = UrlParameter.Optional } // Parameter defaults
将第二个函数从
[HttpPost]
public ActionResult Edit(int id)
到
这样你就不必改变任何逻辑。因为第二个参数是可选的。如果您不提供值,它不会抱怨。如果您在POST controller方法上使用视图模型,请确保您的模型具有空构造函数。这让我快发疯了
namespace app.Models
{
public class UserEdit
{
public User User { get; set; }
public UserEdit() { }
}
}
你可以试试这个
public ActionResult Edit()
{
return View();
}
[HttpPost]
[ActionName("Edit")]
public ActionResult EditPosted()
{
return View();
}
public ActionResult Edit()
{
return View();
}
[HttpPost]
[ActionName("Edit")]
public ActionResult EditPosted()
{
return View();
}