【问题标题】:Cannot find HttpPost method in controller class在控制器类中找不到 HttpPost 方法
【发布时间】:2013-07-24 13:55:32
【问题描述】:

我有一个使用 HTTP.Post 与控制器类中的方法对话的 html 表单。我没有表示此方法的特定视图,只是一个没有相对 cshtml 视图类的 HttpPost ActionResult。我调用这个方法的代码是:

@using (Html.BeginForm("SaveCallout", "SaveCallout"))
{  
    <div class="editor-field">
        @Html.DropDownListFor(m => m.ClientId, new SelectList(Model.Clients, "ClientId", "Name"))
        @Html.ValidationMessageFor(model => model.ClientId)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.Description)
    </div>
    <div class="editor-field">
        @Html.TextAreaFor(model => model.Description, new { @id = "descriptionText" })
        @Html.ValidationMessageFor(model => model.Description)
    </div>
    <input class="btn btn-primary btn-large" style="float: left; margin-right: 10px;" type="submit" value="Create Callout" />
        <a class="btn btn-primary btn-large" href="@Url.Action("EmptyThisCallout", "Callout", null)" id="EmptyCart" style="float: left;">Clear Callout</a>
}

而我的控制器方法是:

    [HttpPost]
    public ActionResult SaveCallout(CalloutViewModel viewModel)
    {
        var Callout = new Callout();
        TryUpdateModel(Callout);
        try
        {
            Callout.ClientId = viewModel.ClientId;

            Callout.CalloutDate = DateTime.Now;
            //Save invoice
            proent.Callouts.Add(Callout);
            proent.SaveChanges();
            //Process the invoice
            var tempCallout = CalloutLogic.GetCallout(this.HttpContext);
            tempCallout.CreateCallout(Callout);

            return RedirectToAction("Complete", new { id = Callout.CalloutId });
        }
        catch
        {
            //Invalid - redisplay with errors
            return View(Callout);
        }
    }

这之前在类似的情况下完美无缺,但现在我收到错误消息“未找到视图‘SaveCallout’或其主控,或者没有视图引擎支持搜索的位置”。我知道它正在寻找一个视图,但我以前从未在这个过程中需要一个视图。

谁能看到我做错了什么?也许我需要发布更多我的代码?

【问题讨论】:

  • 定义SaveCallout动作的控制器类名是什么?
  • 为什么你的控制器名称SaveCallout与发布操作名称相同? BeginForm("SaveCallout", "SaveCallout")我只是好奇。
  • SaveCalloutController 是控制器类的名称。我不知道为什么我会这样做,这在当时是有道理的,正如我之前所说,它过去一直有效,直到我改变了一些东西,但我不确定是什么!

标签: html entity-framework asp.net-mvc-4


【解决方案1】:

您所做的更改是return View(Callout); in catch

return View(...) 不提供视图名称会搜索与您的操作同名的视图。如果是故意的,您应该在Views -&gt; SaveCallout -&gt; SaveCallout.cshtml 放置一个视图,但我认为不是。

我不知道您对HttpPost 的看法。让它被称为Foo。如果你想再次返回Foo 视图,你应该这样做:

catch(...)
{
    return View("Foo", Callout);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多