当我的JavaScript与我的cshtml文件位于同一页面时,这是有效的:
function SaveEntity() {
// more code here
alert(entity.FirstName); // this shows that entity's properties have values
$.post('/Home/Save', { entity: entity }, SaveComplete);
}
该代码现在位于单独的Index.js文件中。在我的控制器中,entity参数不是null,而是它的所有值。为什么会这样呢?
控制器签名:
public ActionResult Save(Entity entity)
{ // method here }
编辑 - Fiddler屏幕截图
修改
这是由Entity Framework生成的Entity类:
public partial class Entity
{
public Entity()
{
this.Contacts = new HashSet<Contact>();
}
public int EntityId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
public string Company { get; set; }
public string LastModifiedUser { get; set; }
public Nullable<System.DateTime> LastModifiedTime { get; set; }
public string Notes { get; set; }
public virtual ICollection<Contact> Contacts { get; set; }
}
修改
完整的Index.js,使用完整的SaveEntity()方法:
var _currentEntities;
$(function () {
// Hide the ID column (column 1)
$('#tableContacts').dataTable({
"aoColumnDefs": [
{ "bSearchable": false, "bVisible": false, "aTargets": [0] }
],
"bLengthChange": false, // don't show the number of records to show per page
"bFilter": false, // don't show the search/filter box
"iDisplayLength": 5
});
$('#waitImage').hide();
// Show the letters of the alphabet, with a link to call GetEntries() for each of them.
for (var i = 65; i <= 90; i++) {
$('#headerAlphabet').append('<a href=\"#\" onclick=\"GetEntries(\''
+ String.fromCharCode(i) + '\')\">'
+ String.fromCharCode(i) + '</a> ');
}
});
function GetEntries(firstLetter) {
// code here
}
function EntriesReceived(entities) {
// code here
}
function DisplayPerson(entityId) {
// code here
}
function SaveEntity() {
// Grab our entity
var entity;
for (var i = 0; i < _currentEntities.length; i++) {
if (_currentEntities[i].EntityId == $('#txtEntityId').val()) {
entity = _currentEntities[i];
break;
}
}
entity.FirstName = $('#txtFirstName').val();
entity.LastName = $('#txtLastName').val();
entity.Address = $('#txtAddress').val();
entity.City = $('#txtCity').val();
entity.State = $('#txtState').val();
entity.ZipCode = $('#txtZipCode').val();
entity.Company = $('#txtCompany').val();
entity.Notes = $('#txtNotes').val();
alert(entity.FirstName);
$.post('/Home/Save', { entity: entity }, SaveComplete);
}
function SaveComplete(saveStatus) {
alert(saveStatus);
}
function CancelChanges() {
alert('Cancel will be done here.');
}
答案 0 :(得分:2)
首先,在进行任何类型的ajax提交时,您希望在Http调试器中查看实际请求,例如Fiddler。您想看看它是否实际上发布了您认为的值。这将帮助您确定问题是在您的javascript中还是在服务器上。现在,你不知道。
其次,您应该发布服务器端实体定义。
编辑:
这似乎是jQuery在默认情况下序列化对象的方式的一个问题,它使用括号表示法,它不适用于默认的模型绑定器。你必须使用Dave提到的传统:true参数。
有关Here的更多信息。以下将解决您的问题。与true参数一起使用时,$.param
方法将强制执行传统的序列化。
$.post('/Home/Save', $.param(entity, true), SaveComplete);.
答案 1 :(得分:2)
我犹豫,b / c我的回答没有说明为什么这可以从View查看但是从js文件失败。但我会使用ajax vs post调用来设置json和传统:
$.ajax({
type: 'POST',
url: '/Home/Save',
dataType: 'json',
traditional: true,
data: entity , //$.toJSON(data),
success: function (data) {
SaveComplete(data);
}
});