MVC4 api路由可以找到一个动作而不是另一个动作

时间:2016-12-06 19:53:33

标签: ajax asp.net-mvc-4

我有以下MVC4 api控制器:

public class VisitorController : ApiController
{
    private ApplicationDbContext db = new ApplicationDbContext();
    public Visitor Get(int id)
    {
        return db.Visitors.Find(id);
    }
    public void SaveNotes(int id, string notes)
    {
        var visitor = db.Visitors.Find(id);
        visitor.Notes = notes;
        db.SaveChanges();
    }
}

Get工作但SaveNotes没有。我无法弄清楚为什么,但在运行时,无法找到SaveNotes。 (对于它的价值,Application Insights可以看到尝试POST到它,并且它得到404错误。请参阅:link

以下是我试图调用它的方式:我有一个模态对话框,如下所示:

<div class="modal fade" id="notesModal">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h4 class="modal-title">Notes</h4>
            </div>
            <div class="modal-body">
                <form id="notesForm">
                    <input type="hidden" name="id" id="notesID"/>
                    <textarea id="notesTextarea" name="notes"></textarea>
                </form>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" onclick="saveNotes();">Save</button>
                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
            </div>
        </div>
    </div>
</div>

我有两个javascript函数;

    function showNotes(id) {
        $("#searchingModal").modal("show");
        $.ajax("@Url.Action("Get", "API/Visitor")/" + id)
            .done(function (data) {
                $("#searchingModal").modal("hide");
                $("#notesID").val(id);
                $("#notesTextarea").val(data.Notes);
                $("#notesModal").modal("show");
            })
            .fail(function (xhr, status, errorThrown) {
                $("#searchingModal").modal("hide");
                genericError(status, errorThrown);
            });
    }
    function saveNotes() {
        //alert("@Url.Action("SaveNotes", "API/Visitor")/");
        $.ajax({ url: "@Url.Action("SaveNotes", "API/Visitor")/", data: $("#notesForm").serialize(), method:"POST" })
            .done(function () {
                $("#notesModal").modal("hide");
            })
            .fail(function (xhr, status, errorThrown) {
                $("#notesModal").modal("hide");
                genericError(status, errorThrown);
            });
    }

showNotes函数效果很好。我运行一个ajax请求,它在访问者控制器上调用Get,返回一个访问者,我用Notes字段填充该textarea,并显示模态。问题是saveNotes。每次我点击模态上的保存按钮,我都会得到失败函数而不是完成函数。 errorThrown是“Not Found”。那怎么只能找到一个动作呢?我试过把[HttpPost]属性放在上面。我已经尝试将id设置为可以为空的int(即使它在路由配置中已经是可选的,请参阅:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

)。我试过让savenotes返回一个字符串而不是void。我尝试使用$ .post而不是$ .ajax。

1 个答案:

答案 0 :(得分:0)

当您获得发布数据时,必须成为对象。所以制作像

这样的对象
public class SaveNotesInput
{
    public int id { get; set; }
    public string notes { get; set;}
}

将您的函数更改为接受该类,如下所示:

public void SaveNotes(SaveNotesInput input)

它应该有效。

(无法告诉你原因)

(感谢Ju66ernaut的评论,我只是为了更容易搜索而得到答案)