我有以下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错误。请参阅:)
以下是我试图调用它的方式:我有一个模态对话框,如下所示:
<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">×</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。
答案 0 :(得分:0)
当您获得发布数据时,必须成为对象。所以制作像
这样的对象public class SaveNotesInput
{
public int id { get; set; }
public string notes { get; set;}
}
将您的函数更改为接受该类,如下所示:
public void SaveNotes(SaveNotesInput input)
它应该有效。
(无法告诉你原因)
(感谢Ju66ernaut的评论,我只是为了更容易搜索而得到答案)