Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ViewResult和ActionResult包含相同参数时出错_C#_Asp.net_Asp.net Mvc_Overloading - Fatal编程技术网

C# ViewResult和ActionResult包含相同参数时出错

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”的成员 如何解决这个问题?这是因为您将相同的参数传递给两个函数,这是不允许的,尽

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

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();
    }