2016-10-10 5 views
1

У меня проблема с созданием «клонирования» данных на странице. Резюме состоит в том, что у меня есть экран создания рабочих мест клиентов и отдельный экран рабочих мест с клиентами. Оба они отлично работают. Мне нужно «клонировать» уже существующие данные о заданиях клиента, чтобы создать новый подобный набор заданий. Поэтому на моем экране управления у меня есть кнопка клонирования. Я хочу, чтобы это переместилось на мою страницу «создать» с данными, предварительно заполненными исходными данными, минус одна или две соответствующие идентифицирующие части информации, например. Название работы.Попытка загрузить данные в новое представление

Моя проблема заключается в том, что я не могу получить сообщение для перенаправления на страницу Создать с моими новыми данными в модели представления. Я не могу выполнить действие отправки, так как это сохраняет данные; данные, которые я клонирую, не будут сохраняться между экранами управления и создания.

Вот где я нахожусь:

В моей CSHTML:

<button type="button" name="btnClone" value="btnClone" id="btnClone" formaction="CloneJob" class="btn btn-primary" style="width: 150px;">Clone</button> 

Это выстреливает событие щелчка, чтобы захватить текущий JobId, который затем выстреливает эту функцию:

function CloneJob(jobId) { 
$.post('CloneJob', { JobId: jobId }, function (data) { 
    window.document(data); 
}); 

}

В моем контроллере у меня есть:

[HttpPost] 
public ActionResult CloneJob(Guid jobId) { 
    // logic which wipes off the old data job from the view model 
    // eg names, ids, etc. but leaves the actual job details intact 

return View("CreateJob", manageJobViewModel); 

Из этого можно видеть, что HTML возвращается в разделе отладки IE/Chrome, но он не будет отображаться в моем представлении CreateJob, заполненном данными.

Что мне не хватает?

+0

В вашем контроллере комментарий кажется предположительным, что вы ожидаете иметь полностью заполненный JobViewModel, чего бы не было. Контроллеры не сохраняют информацию о состоянии между запросами, если вы не запрограммируете их для этого. Я думаю, что все, что вам нужно сделать, это создать JobModelView из базы данных с помощью jobId, с которым вы проходили. –

+0

Логика, которую я оставил, действительно заполняет JobViewModel. Я просто хватаю модель просмотра сеанса, очищаю ее, и это то, что заканчивается как manageJobViewModel, который я хочу вернуть на экран CreateJobs. Я рад, что эта логика работает, поскольку я вижу, что это так, как должно быть, когда я отлаживаю. – JonSick

+0

Если вы видите заполненный JobViewModel в отладчике до «return View», он должен * работать. Я никогда не видел синтаксис «window.document (...)» раньше. Я обычно «window.document.body.innerHtml =», но я бы загрузил только ту часть страницы, которая присутствует внутри тега body. Вы можете использовать веб-отладчик Fiddler, чтобы узнать, что именно отправляется в браузер. –

ответ

0

Мне удалось получить это трещины.

Мой cshtml теперь содержит этот код:

@Html.ActionLink("Clone Job", "CloneJob", null, new { @class = "btn btn-default", @style = "width: 150px" }) 

Мой контроллер просто захватывает текущий ViewModel из сеанса и использует его, чтобы клонировать работу. Затем контроллер теперь просто возвращает представление с новой моделью, которую я создал в этом методе.

return View("CreateJob", clonedJobViewModel); 

Это просто сейчас, когда я смотрю на него, но это становится частью.

1

Во-первых, если вы собираетесь заменить содержимое всего вкладки/окна, не используйте AJAX. Нет смысла, и это просто что-то дополнительное для поддержания. Вместо этого используйте стандартную ссылку. Во-вторых, POST должен выполняться только тогда, когда что-то меняется. Это должно быть просто простым запросом GET.

Создайте ссылку на «создать» URL-адрес и передайте идентификатор для клонируемой работы. Затем в действии create вы можете найти это задание из базы данных на основе этого идентификатора, заполнить вашу модель представления данными и вернуть ее в виде.

Если вы хотите внешний вид кнопки, вы можете просто нарисовать ссылку, чтобы она выглядела как кнопка, но вы должны использовать стандартный старый тег <a>, потому что это семантическое значение здесь.

0

Мне удалось получить еще больше, так как теперь он «работает». Мой контроллер не меняется, но мой Javascript сейчас:

$.when($.get('CloneJob', {jobId: jobId})) 
.then(function (response) 
{ $("body").html(response); }); 

Я понимаю, что это все еще Аякса, но перед лицом альтернативы, которая является технически более приемлемым, это делает работу. Был бы рад принять любые решения для более технически более аккуратного подхода, поскольку я понимаю, что это немного неправильное использование ajax.