2016-04-27 7 views
0

Ich versuche, einige Daten auf eine meiner Aktionsmethoden in einem MVC-Projekt zu buchen. Ich habe bereits eine Ajax-Form, die etwas anderes macht, so dass ich keine andere Ajax-Form verwenden kann. Also habe ich auf $ .post-Funktion zurückgegriffen. Dann ist das Problem, wenn meine Aktionsmethode aufgerufen wird, ist mein Modell null.

Das ist meine Ansicht:

@model ActivityViewModel 

@using (Ajax.BeginForm("Create", "Activities", new AjaxOptions() { UpdateTargetId = "panelContent", InsertionMode = InsertionMode.Replace }, new { id = "createactivity", autocomplete = "off" })) 
{ 
    @Html.AntiForgeryToken() 
    @Html.HiddenFor(m => m.EmployeeId) 
    @Html.HiddenFor(m => m.IsAbscence) 
    @Html.HiddenFor(m => m.Id) 
    @Html.HiddenFor(m => m.ConflictIds) 
    @Html.HiddenFor(m => m.IsAbscence) 

    @Html.TextBoxFor(model => model.Date, "{0:dd.MM.yyyy}", new { @type = "date", @class = "ms-TextField-field", @autocomplete = "off" }) 

    @if (!Model.IsAbscence) 
    { 
     @Html.HiddenFor(m => Model.Favorites, new { @id = "favoritehidden" }) 
     @Html.HiddenFor(m => Model.Archive, new { @id = "archivehidden" }) 

     <script type="text/javascript"> 
        attachFabricCheckBoxHandler('#favoritehidden', '#favoritelabel'); 
        attachFabricCheckBoxHandler('#archivehidden', '#archivelabel'); 
        $(document).ready(function() { 
         $('#favoritelabel').click(function() { 
          var frm = $('#createactivity').serialize(); 
          var token = $('[name=__RequestVerificationToken]').val(); 
          $.post({ 
           type: 'POST', 
           contentType: 'application/x-www-form-urlencoded; charset=UTF-8', 
           url: '/Activities/FilterProjects/', 
           data: { __RequestVerificationToken: token, model: frm.substring(frm.indexOf("&") + 1) }, 
           statusCode: { 
            404: function (content) { showErrorDialog(content); }, 
            500: function (content) { showErrorDialog(content); } 
           }, 
           success: function (data) { 
            alert(data); 
           }, 
           error: function (req, status, errorObj) { 
            showErrorDialog(status); 
           } 
          }); 
         }); 
        }); 
     </script> 

     @Html.DropDownListFor(m => m.ProjectId, new SelectList(ViewBag.Projects, "Id", "ProjectDescription"), new { @class = "ms-Dropdown-select" }) 
    } 
    @Html.TextBoxFor(model => model.StartTime, "{0:HH:mm}", new { @readonly = "readonly", @class = "ms-TextField-field", @placeholder = "Click to choose time" }) 

    @Html.TextBoxFor(model => model.EndTime, "{0:HH:mm}", new { @readonly = "readonly", @class = "ms-TextField-field", @placeholder = "Click to choose time" }) 

    @Html.TextAreaFor(model => model.Description, new { @class = "ms-TextField-field", @style = "height:100px; resize:vertical;" }) 

    @if (!Model.IsAbscence) 
    { 
     @Html.TextAreaFor(model => model.Comment, new { @class = "ms-TextField-field", @style = "height:100px; resize:vertical;" }) 
    } 
} 

Hinweis ich alle unnötigen HTML entfernt, die Struktur ist im Grunde das gleiche. Hier ist meine Viewmodel:

public class ActivityViewModel 
{ 
    public int Id { get; set; } 
    public DateTime Date { get; set; } 
    public DateTime StartTime { get; set; } 
    public DateTime EndTime { get; set; } 
    public string Description { get; set; } 
    public int EmployeeId { get; set; } 
    public string ConflictIds { get; set; } 
    public string Comment { get; set; } 
    public int ProjectId { get; set; } 

    public bool IsAbscence { get; set; } 

    public bool Archive { get; set; } 

    public bool Favorites { get; set; } 
} 

Als ich diese verwenden, habe ich immer null bekommen in meinem Aktionsmethode:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult FilterProjects(ActivityViewModel model) 
{    
    //When 'object model' is being passed, the serialized string and all the properties are there... 
    return PartialView("Create"); 
} 

Die seltsame Sache ist, wenn ich ein Objekt statt meiner typisierte Viewmodel passieren in meinem Aktionsmethode, erhalte ich den serialisierten String mit allen meinen Eigenschaften:

EmployeeId=1& 
IsAbscence=False& 
Id=0& 
ConflictIds=& 
IsAbscence=False& 
Date=27.04.2016& 
Favorites=True& 
Archive=False& 
ProjectId=1& 
StartTime=10%3A25& //Maybe these two values are screwing up the model? 
EndTime=11%3A25& 
Description=& 
Comment=& 

ich konnte mein Viewmodel aus dieser Zeichenfolge wieder instanziiert, aber es wäre viel schöner, wenn ich mein typisierte Modell in meine Aktion übergeben habe. Wie wird das Formular ordnungsgemäß serialisiert, damit es beim Aufruf der Aktion nicht null ist? Ich habe versucht, die "StartTime" - und "EndTime" -Eigenschaften wegzulassen, und ich habe die Validierungs-Token-Zeichenfolge ausgeschnitten, weil ich dachte, dass sie hier stören, aber das hat offensichtlich nicht funktioniert.

Antwort

0

Wenn Sie das Formular serialisieren, wird AntiForgeryToken eingeschlossen. Versuchen Sie, das Formular ohne Angabe von __RequestVerificationToken zu senden:

$('#favoritelabel').click(function() { 
    var frm = $('#createactivity').serialize(); 

    $.post('/Activities/FilterProjects/', frm, function (data) { 
    }).fail(function (xhr, status, errorThrown) { 
     showErrorDialog(status); 
    }); 
});