Отправка строки и модели в Url.Action - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть следующий URL.Action в моем cshtml:

<a href="@Url.Action("ShowStudent", "Student", new { studentCode = item.StudentCode, newPrivateStudent = Model.PrivateStudent })">
             <i class="icon-arrow-right"></i>
</a>

Действие в моем контроллере:

 public ActionResult ShowCShowStudentlient(studentCode studentCode , PrivateStudentModel newPrivateStudent )
    { *some actions*}

Когда действие выполняется в контроллере, newPrivateStudent устанавливается в значение null.

Есть идеи почему?
Свойства newPrivateStudent установлены как скрытые в cshtml.

1 Ответ

0 голосов
/ 04 сентября 2018

Во-первых, вы должны посмотреть на этот @Url.Action помощник:

@Url.Action("ShowStudent", "Student", new { studentCode = item.StudentCode, newPrivateStudent = Model.PrivateStudent })

Приведенный выше помощник сгенерирует URL со строкой запроса, как в следующем примере (уже протестирован):

<a href="/Student/ShowStudent?studentCode=XXX&newPrivateStudent=ProjectNamespace.Models.PrivateStudent">...</a>

Как вы видите в последнем параметре (newPrivateStudent), вместо добавления содержимого сложного объекта, помощник неявно вызывает ToString(), который возвращает полностью определенное имя этого объекта (и впоследствии newPrivateStudent имеет нулевое значение в действии метод). Следовательно, правильный способ сделать это - использовать обратный вызов AJAX для отправки соответствующего ключа вместе с содержимым модели в действие контроллера и отправки своего ответа в виде частичного представления целевому элементу DOM.

Вот пример отправки содержимого модели внутри формы с обратной передачей AJAX (предполагается, что для создания элементов ввода используются HTML-помощники):

$('#triggerElementId').click(function () {
     // this example sets string parameter as hardcoded string
     // change it to actual value by jQuery selector with val() or text() function
     var sCode = "XXX"; 

     var modelData = $('form').serialize(); 
     // or serializeArray() if you want to push additional data
     // if model contents should left unchanged, use 'var modelData = @Html.Raw(Json.Encode(Model.PrivateStudent))'

     $.ajax({
         type: 'POST',
         url: '@Url.Action("ShowStudent", "Student")',
         data: { studentCode: sCode, newPrivateStudent: modelData },
         success: function (result) {
             $('#targetResultElement').html(result);
         },
         error: function (xhr, status, error) {
             // error handling
         }
     });
});

Затем установите действие контроллера для извлечения ключа и сериализованного содержимого модели, как в примере ниже:

[HttpPost]
public ActionResult ShowStudent(string studentCode, PrivateStudentModel newPrivateStudent)
{
    // some actions

    return PartialView("_ShowStudent", viewModelName); // mention partial view & viewmodel name here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...