Рендеринг PartialView в View on Demand

на странице есть 2 DropDownList + текстовое поле + кнопка отправки.

При отправке предполагается выбрать и заполнить частичное представление в зависимости от того, какое значение выбрано в первом DropDownList. У меня это несколько сработало; однако он всегда будет возвращать pv в новом окне, а не отображать его в div основного представления.

Я использую MVC 3 + Telerik.

Наиболее важные части кода:

ПРОСМОТР — обновлено

<script type="text/javascript">

    function onMainDDL1Change(e) {
        var combo = $("#SubDDL1").data("tComboBox");
        combo.value("");
        combo.reload();
    }

    function onSubDDL1DataBinding(e) {
        var combo = $("#MainDDL1").data("tComboBox");
        e.data = $.extend({}, e.data, { mainDDL1ID: combo.value() });
    }
</script>

@using (Ajax.BeginForm("PartialGrid", "DataSearch", new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "result", InsertionMode = System.Web.Mvc.Ajax.InsertionMode.Replace }))
{ 
<table>
    <tr>
        <td>
            @(Html.Telerik().ComboBox()
                .Name("MainDDL1")
                .AutoFill(true)
                .DataBinding(binding => binding.Ajax().Select("LoadMainDDL", "DataSearch"))
                .HighlightFirstMatch(true)
                .ClientEvents(events => events.OnChange("onMainDDL1Change"))
                )
        </td>
    </tr>    
    <tr>
        <td>
            @(Html.Telerik().ComboBox()
                .Name("SubDDL1")
                .DataBinding(binding => binding.Ajax().Select("LoadSubDDL1", "DataSearch"))
                .HighlightFirstMatch(true)
                .ClientEvents(events => events.OnDataBinding("onSubDDL1DataBinding"))
                )
        </td>
    <tr>
        <td>
            @Html.TextBoxFor(o => o.sSearch1)
        </td>
    </tr>
    <tr align="center">
        <td colspan="4">
        <input type="submit" class="t-button" value="Search" name="submit" />
        </td>
    </tr>
</table>
}

<div id="result">
</div>

Контроллер — обновлено

[HttpPost]
 //PartialView
    public PartialViewResult PartialGrid(DataSearchModel voModel)
    {
        voModel.dtResultSet1 = DLA.DataSearchContext.getResultSet1(voModel.MainDDL1, voModel.SubDDL1, voModel.sSearch1);
        return PartialView("_TPRCL", voModel);
    }


    //Initial View
    public ViewResult DataSearch(string text)
    {
        DataSearchModel oModel = new DataSearchModel();
        oModel.alMainDDL = DLA.DataSearchContext.getMainDDL();

        return View(oModel);
    }

Частичный просмотр

    @model ISC.Utilities.GISTransactionTools.Models.DataSearchModel


 @(Html.Telerik().Grid(Model.dtResultSet1)
            .Name("Grid")
            .Footer(false)
            .Columns(columns =>
                {
                    columns.Bound(o => o.Row[0]).Title("T_PRCL");
                }))

В PartialView Grid на самом деле больше столбцов, это просто для того, чтобы заставить его работать.


person seN    schedule 05.07.2012    source источник
comment
Ваш подход работает без контроллера Telerik?   -  person Yusubov    schedule 05.07.2012
comment
Да, единственная вещь, которую я действительно использую от телерика, это Grid и DropDownLists здесь. Поэтому это не должно сильно влиять на это.   -  person seN    schedule 05.07.2012


Ответы (2)


Я не использую Telerik, но вот как я делаю что-то подобное:

В начальном представлении у меня есть следующий код:

    @using (Ajax.BeginForm("PhoneForm", "Home", new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "form-lead", InsertionMode = InsertionMode.Replace, OnSuccess = "HookupValidation" })) {
        @Html.ValidationSummary(false, "Please address the following items:")

        <div class="phone">
            <div class="field">
                @Html.LabelFor(model => model.Phone1)
                @Html.EditorFor(model => model.Phone1)
                @Html.ValidationMessageFor(model => model.Phone1)
            </div>
            <div class="button">
                <input type="submit" value="Get Customer" name="submit" /></div>
        </div>

    }
    <div id="form-lead">
    </div>

По сути, когда нажимается кнопка «Получить клиента», она вызывает через AJAX метод «PhoneForm» в моем «домашнем» контроллере. Этот метод создает частичное представление, которое затем вставляется (InsertionMode = InsertionMode.Replace) в (UpdateTargetId = "form-lead"). Функция OnSuccess предназначена только для того, чтобы убедиться, что проверка на стороне клиента и события jQuery подключены к частичному представлению. Если вы этого не сделаете, никакая проверка или сценарий на стороне клиента не будут работать для элементов в частичном представлении.

Код контроллера для «PhoneForm» выглядит следующим образом:

    [HttpPost]
    public PartialViewResult PhoneForm(string Phone1) {
        HomeViewModel viewModel = new HomeViewModel();

        // ... get data and set up view model here ... //
        // ... also choose which partial view you want to return ... //

        return PartialView("LeadInfoPartial", viewModel);
    }

Надеюсь, это поможет вам решить вашу проблему.

person nikeaa    schedule 05.07.2012
comment
Я последовал вашему примеру и обновил свой вопрос, он решил другую проблему, которая у меня была; однако он по-прежнему отображает PartialView в новом окне, а не в моем основном представлении. - person seN; 05.07.2012
comment
Не уверен, имеет ли это какое-то значение или нет, но в моем контроллере я возвращаю PartialViewResult вместо ActionResult, как ваш код. - person nikeaa; 05.07.2012
comment
Я тоже это заметил и изменил... Все та же проблема. Я также добавил PartialView... Может быть, что-то не так? - person seN; 05.07.2012
comment
Что пытается сделать код в функции JS updatePlaceholder()? Похоже, он пытается поместить результаты частичного просмотра на страницу, но параметры в Ajax.BeginForm должны делать это автоматически, без этого. - person nikeaa; 05.07.2012
comment
Я взял его у telerik .com/help/aspnet-mvc/, когда я пытался решить проблему с помощью ActionLink. Я вынул Скрипт сейчас, так как он больше не нужен. Все та же проблема. - person seN; 05.07.2012

Хорошо, это работает в Javascript.

Просмотр

 <script type="text/javascript"> $('#btnSubmit').click(function () {
             var time = new Date().getTime(); // @* unique random number to workaround IE cache issue - IE will cache the ajax if you
 don't use this *@
             var oMainDDL1 = $('#MainDDL1').data("tComboBox");
             var oSubDDL1 = $('#SubDDL1').data("tComboBox");
             var sSearch1 = $("#Search1").val();

  var actionURL = '@Url.Action("getGrid1", "DataSearch", new { MainDDL1
 = "PLACEHOLDER" })'.replace('PLACEHOLDER', oMainDDL1.value()) + "&SubDDL1=" + oSubDDL1.value() + "&Search1=" + sSearch1 + "&time=" +
 time;
             if (actionURL != null) {
                 $.get(actionURL, function (data) {
                     $('#result1').fadeOut('slow', 'linear', function () { $('#result1').empty(); $('#result1').append(data); });
                     $('#result1').fadeIn('slow', 'linear', function () {
                         if ($.browser.msie) {
                             this.style.removeAttribute('filter'); // @* Needed to fix IE7 cleartype bug with jQuery fade, but will crap out
 on FF/Chrome *@
                         }
                     });
                 });
             }
         });
     }); </script>

             @(Html.Telerik().ComboBox()
                 .Name("MainDDL1")
                 .AutoFill(true)
                 .DataBinding(binding => binding.Ajax().Select("LoadMainDDL", "DataSearch"))
                 .HighlightFirstMatch(true)
                 .ClientEvents(events => events.OnChange("onMainDDL1Change"))
                 )

             @(Html.Telerik().ComboBox()
                 .Name("SubDDL1")
                 .DataBinding(binding => binding.Ajax().Select("LoadSubDDL1", "DataSearch"))
                 .HighlightFirstMatch(true)
                 .ClientEvents(events => events.OnDataBinding("onSubDDL1DataBinding"))
                 )

             @Html.TextBox("Search1")

 <input type="button" class="t-button button1" value="Search"
 id="btnSubmit" />

 <div id="result1"> </div>

Контроллер

public PartialViewResult getGrid1(string MainDDL1, string SubDDL1, string Search1)
{
    DataSearchModel voModel = new DataSearchModel();
    voModel.dtResultSet1 = DLA.DataSearchContext.getResultSet1(MainDDL1, SubDDL1, Search1);
    return PartialView(MainDDL1, voModel);
}

public ViewResult DataSearch(string text)
{
    DataSearchModel oModel = new DataSearchModel();
    oModel.alMainDDL = DLA.DataSearchContext.getMainDDL();

    return View(oModel);
}
person seN    schedule 06.07.2012