Сделайте запрос HttpPost для метода действия в контроллере ASP.NET MVC

Я пытаюсь создать функциональность, где мне нужно создать профиль кандидата в нашем приложении. Существует два шага / пользовательского интерфейса для создания профиля кандидата:

1 - Создать шаблон... где пользователь вводит информацию о кандидате.

2 - Шаблон предварительного просмотра... где пользователю будет показан предварительный просмотр того, как будет выглядеть его профиль, как только он добавит профиль в нашу систему.

Я уже создал представления для поддержки этих интерфейсов через контроллер под названием "CandidateController", который содержит несколько методов действия:

1- [HttpGet] "Создать", который возвращает шаблон "Создать".

[HttpGet]
public ViewResult Create()

2- [HttpPost] "Предварительный просмотр", который возвращает шаблон предварительного просмотра.

 [HttpPost]
 public ActionResult Preview(ProfileViewModel viewModel)

Теперь мне нужно реализовать кнопку / ссылку в шаблоне Create, которая будет вызывать метод действия [HttpPost] Preview в контроллере.

Задача Мне также интересно, есть ли способ, которым связыватель модели загрузит для меня объект ViewModel, если я смогу вызвать метод действия HttpPost Preview из первого шаблона создания.

Я ищу предложение / помощь о том, как наилучшим образом достичь такого рода функциональности.

Любая помощь будет высоко оценена.

2 ответа

Решение

Задача Мне также интересно, есть ли способ, которым связыватель модели загрузит для меня объект ViewModel, если я смогу вызвать метод действия HttpPost Preview из первого шаблона создания.

Вы можете использовать либо стандартную форму, либо вызов AJAX, чтобы вызвать действие Preview POST и передать все значения свойств модели представления. Все значения, которые вы передаете в этом запросе, будут значениями, которые будут связаны связывателем модели по умолчанию. Вот статья, объясняющая, как механизм связывания модели по умолчанию ожидает именования параметров для более сложной структуры, такой как списки и словари.

Пример с AJAX:

$.ajax({
    url: '@Url.Action("Preview")',
    type: 'POST',
    data: { Prop1: 'value 1', Prop2: 'value 2' },
    success: function(result) {
        // TODO: do something with the result returned from the POST action
    }
});

Если вы не хотите использовать AJAX, вы можете использовать стандартную форму со скрытыми полями:

@using (Html.BeginForm())
{
    @Html.Hidden("Prop1", "value 1")
    @Html.Hidden("Prop2", "value 2")
    ...
    <button type="submit">Preview</button>
}

Итак, вот варианты, которые мне пришлось обойти:

  • Как предположил Дарин, вы можете пойти ненавязчивым путем, используя $.ajax(параметры), однако дело в том, что вы можете пойти по этому пути, только если вы хотите выполнить частичное обновление страницы или если вы хотите работать над обновлением / дампом новый HTML в том же виде.
  • И если вы не хотите использовать Ajax, вместо использования скрытых полей, вы можете просто использовать свойство TempData в MVC, вот как я реализовал свою целевую функциональность, используя TempData. psbelow...

    [HttpPost]       
    public ActionResult Create(ViewModel viewModel)
    {
        this.TempData["profile"] = viewModel;
        return RedirectToAction("Preview");
    }
    
    
    public ActionResult Preview()
    {            
    
        if (TempData["profile"] != null)
        {
            return View((ViewModel)TempData["profile"]);
        }
    
        // Handle invalid request...
        return null;
    }
    

Таким образом, это решение работало довольно хорошо для меня, где я не писал ни JavaScript, ни ненужного HTML. И спасибо Дарину за то, что он направил меня к отправной точке.

Другие вопросы по тегам