【问题标题】:AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:AmbiguousActionException:匹配多个操作。以下操作匹配路由数据并满足所有约束:
【发布时间】:2019-08-02 18:04:03
【问题描述】:

我知道有更多关于此的问题,但它们似乎对我不起作用。

我按照以下教程进行操作:https://www.youtube.com/watch?v=hlZexx2gbNs

我想在 MVC ASP.NET 中制作一个电子邮件发送表单。 除了最后一步,一切似乎都奏效了。我不得不更改 RouteConfig,但我没有 routeconfig。

我认为我需要更改它才能使其正常工作,但我不知道在哪里更改它。有谁知道如何解决这个问题?

如果在另一个问题上有很好的解决方案,请告诉我。

这是我用于视图的解码代码:

@model smoothboard.Models.gmail

@{
ViewData["Title"] = "Index";
}

<h2>Index</h2>

<h4>Email</h4>
<hr />

<div>
    @using (Html.BeginForm("Index", "EmailSetup", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
    <table>
        <tr>
            <td>
                Naar:
            </td>
            <td>
                @Html.TextBoxFor(gmail=>gmail.To)
            </td>
        </tr>
        <tr>
            <td>
                <input type="submit" value="Verzend">
            </td>
        </tr>
    </table>
    }
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

这是我用来发送邮件的代码:

public class EmailSetupController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
    string from = new string("hans31833@gmail.com");
    string subject = new string("Geregistreerd");
    string body = new string("Je hebt je ingeschreven voor de nieuwsbrief!");
    public IActionResult Index(smoothboard.Models.gmail gmail, string from)
    {

        MailMessage mm = new MailMessage(from, gmail.To);
        mm.Subject = subject;
        mm.Body = body;
        mm.IsBodyHtml = false;

        SmtpClient smtp = new SmtpClient();
        smtp.Host = "smtp.gmail.com";
        smtp.Port = 587;
        smtp.EnableSsl = true;

        NetworkCredential nc = new NetworkCredential("hans31833@gmail.com", "hans1234hans");
        smtp.UseDefaultCredentials = true;
        smtp.Credentials = nc;
        smtp.Send(mm);
        ViewBag.MailMessage = "Mail is verzonden";
        return View();
    }
}

这是我用于模型的:

namespace smoothboard.Models
{
public class gmail
{
    public string To { get; set; }
}
}

【问题讨论】:

  • 您有 public IActionResult Index 方法定义与相同的 HTTP 方法 (GET),这会导致不明确的匹配。替换您的操作方法名称之一或改用[HttpPost] 属性。
  • 那我该如何使用这个方法呢?
  • 使第二个操作方法使用 HTTP POST 方法,如下面的答案所述。
  • 啊,我明白了,它起作用了,但现在它说 MailMessage mm = new MailMessage(from, gmail.To);不能为空

标签: html asp.net-mvc model-view-controller gmail mailmessage


【解决方案1】:

异常消息提到的问题很简单:你有2个同名的动作方法和相同的HTTP方法(默认HTTP方法是GET,隐式使用[HttpGet]):

// first action with GET method
public IActionResult Index() { ... }

// ambiguous matching here because this also uses GET method
public IActionResult Index(smoothboard.Models.gmail gmail, string from) { ... }

由于您有使用FormMethod.PostBeginForm 助手:

@using (Html.BeginForm("Index", "EmailSetup", FormMethod.Post, new { enctype = "multipart/form-data" }))

那么你必须使用[HttpPost]属性来装饰第二个Index动作以区分它的HTTP方法:

[HttpPost]
public IActionResult Index(smoothboard.Models.gmail gmail, string from)
{
    MailMessage mm = new MailMessage(from, gmail.To);
    mm.Subject = subject;
    mm.Body = body;
    mm.IsBodyHtml = false;

    SmtpClient smtp = new SmtpClient();
    smtp.Host = "smtp.gmail.com";
    smtp.Port = 587;
    smtp.EnableSsl = true;

    NetworkCredential nc = new NetworkCredential("hans31833@gmail.com", "hans1234hans");
    smtp.UseDefaultCredentials = true;
    smtp.Credentials = nc;
    smtp.Send(mm);
    ViewBag.MailMessage = "Mail is verzonden";
    return View();
}

【讨论】:

  • 谢谢,但现在它说 MailMessage mm = new MailMessage(from, gmail.To);不能为空
猜你喜欢
  • 1970-01-01
  • 2018-08-12
  • 2018-12-13
  • 2020-09-14
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
相关资源
最近更新 更多