1

これは、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ファイルにあります。私のコントローラーでは、エンティティーパラメーターはnullではありませんが、その値はすべてnullです。なぜ今それが起こるのでしょうか?

コントローラの署名:

public ActionResult Save(Entity entity)
{ // method here }

ここに画像の説明を入力してください

編集-フィドラーのスクリーンショット

ここに画像の説明を入力してください

ここに画像の説明を入力してください

編集

これは、EntityFrameworkによって生成された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; }
}

編集

完全なSaveEntity()メソッドを使用した完全なIndex.js:

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.');
            }
4

2 に答える 2

2

私は躊躇します、b / c私の答えは、これがViewからは機能するのに、jsファイルからは失敗する理由を説明していません。しかし、私はajax vs post callを使用して、jsonとtraditionalを設定できるようにします。

 

$.ajax({
    type: 'POST',
    url: '/Home/Save',
    dataType: 'json',
    traditional: true,
    data: entity , //$.toJSON(data),
    success: function (data) {
          SaveComplete(data);
    }
});
于 2013-03-02T03:54:50.457 に答える
2

まず、あらゆる種類の ajax 送信を行う場合、Fiddler などの Http デバッガーで実際の要求を確認する必要があります。あなたが思っている値が実際に投稿されているかどうかを確認したいのです。これは、問題が JavaScript にあるのかサーバーにあるのかを特定するのに役立ちます。今のところ、あなたは知りません。

参照:これこれ

次に、サーバー側のエンティティ定義を投稿する必要があります。

編集:

これは、jQuery がデフォルトでオブジェクトをシリアル化する方法に問題があるようです。これは、デフォルトのモデル バインダーでは機能しないブラケット表記を使用します。Dave が言及している traditional: true パラメータを使用する必要があります。

詳細はこちら. 以下はあなたの問題を解決します。メソッドを true パラメーターと共に使用すると、$.param従来のシリアル化が強制されます。

$.post('/Home/Save', $.param(entity, true), SaveComplete);. 
于 2013-03-02T03:43:32.957 に答える