使用不显眼的JavaScript,参数不为null,但其值为

时间:2013-03-02 02:28:57

标签: c# javascript jquery asp.net-mvc-4

当我的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 }

enter image description here

编辑 - Fiddler屏幕截图

enter image description here

enter image description here

修改

这是由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.');
            }

2 个答案:

答案 0 :(得分:2)

首先,在进行任何类型的ajax提交时,您希望在Http调试器中查看实际请求,例如Fiddler。您想看看它是否实际上发布了您认为的值。这将帮助您确定问题是在您的javascript中还是在服务器上。现在,你不知道。

请参阅:ThisThis

其次,您应该发布服务器端实体定义。

编辑:

这似乎是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);
    }
});