Не удается отобразить сообщение с TempData или jquery.cookie

Я использую Ajax для вызова Action и пытаюсь отобразить возвращенное сообщение от Controller до View. Однако, хотя сообщение возвращается с TempData, оно не отображается в представлении (на самом деле я отображал его в @Html.BeginForm(), но в этот раз я использую <form> и, возможно, это связано с этим). С другой стороны, я попытался использовать jquery.cookie, как описано в эта страница, но не может отобразить сообщение. Не могли бы вы дать мне образец для TempData и jquery.cookie, показав необходимые строки на Controller и View? Заранее спасибо.

Просмотр:

<form id="frmCreate"  action="Create" method="post" enctype="multipart/form-data" >

@if (TempData["message"] != null)
{
    <div class="text-danger">@TempData["message"].ToString()</div>
}
//... removed for brevity
</form>


Контроллер:

public ActionResult Create([Bind(Exclude = null)] PersonViewModel person)
{
    //Some stuff (removed for brevity)
    TempData["message"] = "Record has been added...";
    return PartialView("Create", person);
}


=============================== Обновление ============ ====================

Просмотр:

@model PersonViewModel

<form id="frmCreate"  action="Create" method="post" enctype="multipart/form-data" >

@Html.AntiForgeryToken()

<div class="container">

    @Html.ValidationSummary(true)

    <div><b>Message:@ViewBag.Message</b></div>

    @Html.LabelFor(m => m.ProjectID)
    @(Html.Kendo().DropDownList()
          .Name("ProjectID")
          //... removed for brevity
    )
    <br />

    @*Render Partialview according to Dropdownlists selectedIndex*@
    <!-- Place where you will insert your partial -->
    <div id="partialPlaceHolder" style="display:none;"></div>

</div>


<div class="modal-footer">
    @(Html.Kendo().Button().Name("btnCancel"))

    @(Html.Kendo().Button().Name("btnSubmit"))
        .HtmlAttributes(new { type = "submit"})
</div>

</form>



<script type="text/javascript">

//OnLoad method & functions::::::::::
$(function () {      
    var selectedProjectId = $('#ProjectID').val(); /* Get the selected value of dropdownlist */       
    var json = JSON.stringify(@Model);
    $.ajax({
        type: "POST",
        url: '@Url.Action("RenderPartialView", "Person")' + selectedProjectId,
        contentType: "application/json; charset=utf-8",
        data: json,
        dataType: "json",
        success: function (data) {
            // get the result and do some magic with it
            var message = data.Message;
            $("#resultMessage").html(message);
        }
    });


});


//For keeping model values we use <form> instead of Html.BeginForm()
$('form').submit(function (event) {
    event.preventDefault();
    $.post('Person/Create', $(this).serialize()).done(function () {

    }).fail(function () {

    });
});

//Render Partialview according to Dropdownlist's selectedIndex
$('#ProjectID').change(function () {  
    var selectedProjectId = $(this).val();
    $.get('/Person/RenderPartialView/' + selectedProjectId, function (data) {
        $('#partialPlaceHolder').html(data);
    });        
});

</script>

person Jack    schedule 17.06.2015    source источник
comment
Вопрос: какой смысл возвращать частичное представление. Почему бы не вернуть объект JSON с параметром результата успеха или неудачи?   -  person PaulBinder    schedule 18.06.2015
comment
Я вызываю частичное представление внутри представления. Но проблема заключается в представлении, потому что представление отображается первым, а TempData[message] должно отображаться до вызова частичного представления. Это правда? Что касается возвращаемого типа, я использовал некоторые методы контроллера, возвращающие JSon, но они связаны со списком, и я не знаю, какие изменения следует внести в действие моего контроллера, чтобы вернуть JSon. Не могли бы вы привести пример простого возврата JSon? Заранее спасибо.   -  person Jack    schedule 18.06.2015
comment
@PaulBinder На самом деле при использовании TempData или ViewBag сообщение отображается в ответе Firebug, но не отображается. Есть идеи?   -  person Jack    schedule 18.06.2015
comment
Как вы используете Ajax? Вам нужно показать сценарий. Но в любом случае TempData здесь не подходит (для передачи данных между запросами). Использование ViewBag было бы более подходящим.   -  person    schedule 18.06.2015
comment
@StephenMuecke Я добавил код просмотра к вопросу. Я также использовал с viewbag, но, хотя он кажется в ответе, он не может быть отображен. Я думаю, что он может исчезнуть во время вызова частичного просмотра из представления.   -  person Jack    schedule 18.06.2015
comment
Вы сказали, что используете ajax, но не показали скрипт   -  person    schedule 18.06.2015
comment
@StephenMuecke Я добавил сейчас. Извините, я не подумал, что вы так быстро :)   -  person Jack    schedule 18.06.2015
comment
Я немного смущен - у вас есть 3 вызова ajax (только один кажется актуальным для вопроса, поэтому вам следует удалить остальные). Ни один из них не вызывает метод Create(), который вы показали. Ближайший из них — $.post('Issue/_Create', ...., но он все равно ничего не делает.   -  person    schedule 18.06.2015
comment
Я обновил код. Да, метод публикации - $.post('Person/Create', $(this).serialize()).done(function () строка.   -  person Jack    schedule 18.06.2015
comment
Теперь вы удалили все скрипты :)   -  person    schedule 18.06.2015
comment
Нет, я просто обновился :( С другой стороны, я использовал для передачи данных с TempData в моем предыдущем проекте. Как вы сказали, я должен использовать ViewBag, однако это не имеет никакого смысла. Я думаю, что сообщение viewbag возвращается к представлению, но после вызова частичного представления оно исчезло, как вы думаете?   -  person Jack    schedule 18.06.2015
comment
@Christof, все еще немного не уверен, что ты делаешь. Ваш метод $.post('Person/Create', $(this).serialize()..` может обратиться к методу и вернуть какой-то html, но вы ничего с ним не сделаете. Но поскольку метод просто возвращает точно такое же представление (с сообщением), было бы лучше просто вернуть сообщение как json и обновить DOM.   -  person    schedule 18.06.2015
comment
Извините, у меня нет опыта работы с Ajax и Javascript. Не могли бы вы опубликовать исправленный образец в качестве ответа? Заранее спасибо.   -  person Jack    schedule 18.06.2015
comment
@Christof, ну, вы делаете что-то подобное в своем первом скрипте (// метод и функции OnLoad ...), но это тоже немного странно :). Вы хотите отобразить сообщение, возвращаемое методом Create(), в элементе с id="ResultMessage"? - и, пожалуйста, начните свое сообщение, как я сделал с этим, чтобы я получил уведомление :)   -  person    schedule 18.06.2015
comment
Я забыл удалить ResultMessage. Что я делаю и хочу сделать: 1) Я вызываю частичное представление, когда selectedProjectId изменен (раскрывающийся список) и загружена форма. 2) Я вызываю действие в контроллере с помощью Ajax и возвращаю представление и сообщение. С другой стороны, можно вернуть Json. 3) Я пытался использовать Html.BeginForm() и Ajax.BeginForm(), но это было невозможно, и мне пришлось использовать ‹form› и вызов Ajax. Итак, не могли бы вы предоставить решение, имеющее AjaxCall и метод контроллера, возвращающий представление и сообщение TempData/ViewBag. Не могли бы вы помочь, пожалуйста? Заранее спасибо.   -  person Jack    schedule 18.06.2015
comment
@StephenMuecke Любой ответ, пожалуйста?   -  person Jack    schedule 18.06.2015
comment
@StephenMuecke При использовании Ajax я не могу загружать файлы, которыми я управлял с помощью Html.BeginForm(). Есть идеи?   -  person Jack    schedule 18.06.2015
comment
Я отвечу, но вы забыли меня предупредить :). Нужен перерыв, посмотрю чуть позже.   -  person    schedule 18.06.2015
comment
@StephenMuecke: Большое спасибо за помощь. На самом деле я использовал @Html.BeginForm() в своих проектах до и после использования Ajax, есть не только TempData проблема, но и File Upload проблема, с которой я столкнулся. Поэтому, если лучше использовать @Html.BeginForm(), не тратьте свое время на решение этой проблемы. Вместо этого взгляните на Почему PartialView не может перезагружаться с помощью Ajax в МВК ›››   -  person Jack    schedule 18.06.2015
comment
››› Потому что я бы использовал @Html.BeginForm, если бы решил эту проблему. Единственное, что мне нужно, чтобы сохранить значения модели после отправки формы и вернуться обратно в представление. Было бы гораздо лучше решить этот вопрос. Не могли бы вы помочь с этой проблемой? Заранее спасибо.   -  person Jack    schedule 18.06.2015
comment
@Christof, вы отметили этот ответ как принятый, поэтому я предполагаю, что ваши проблемы решены. Но вы упомянули, что не можете загружать файлы с помощью ajax - вы можете. См. >этот ответ   -  person    schedule 19.06.2015
comment
@StephenMuecke Да, мне удалось перезагрузить всплывающее окно с данными модели с помощью Ajax. Однако в то время я столкнулся с новой проблемой, связанной с вложением файлов, так как это не подходит для Ajax, поскольку я вижу ответ на stackoverflow. Итак, я изменил свою структуру и решил снова использовать @Html.BeginForm() (я оставил всплывающее окно и использовал представление на странице). За это время столкнулся с повторной загрузкой частичного представления (у меня есть представление и есть выпадающий список ProjectID. ›››   -  person Jack    schedule 19.06.2015
comment
@StephenMuecke ››› При изменении раскрывающегося списка частичное представление отображается в представлении. Я также вызываю связанный метод javascript при загрузке формы, однако частичное представление не отображается, когда форма возвращается из контроллера :( Мой вопрос заключается в следующем: можно ли перезагрузить частичное представление, когда оно возвращается из контроллера с помощью @Html.BeginForm() и без Ajax? Если нет, то проблем нет, и я буду использовать новое представление для раскрывающегося списка ProjectID и передам его значение другому представлению «Создать» (я использую кнопку «Далее» после того, как пользователь выберет раскрывающийся список ProjectID), а затем открою новое представление. Любое предложение, пожалуйста?   -  person Jack    schedule 19.06.2015