Как я могу сделать несколько действий за один звонок? - PullRequest
1 голос
/ 18 мая 2011

как я могу сделать несколько разных действий за один вызов для конкретного контроллера? Html.RenderAction () / Html.Action () обрабатывает только один контроллер и действие. Но что, если я хочу, чтобы в одном вызове отображались разные виды на экране?

спасибо заранее, Sagiv

EDIT: Привет еще раз.
Я не уверен, что вы поняли мой вопрос. это cshtml:

   <div id="menu">@using (Ajax.ActionLink("click me", "SomeAction","SomeController", new AjaxOptions() { HttpMethod = "POST", OnSuccess = "showMsg", OnFailure = "showError" }))</div>
    <div id="div1">bla bla content</div>
....
    <div id="div2">bla bla content</div>

и это контроллер:

 public class SomeController : Controller
    {
        public ActionResult SomeAction()
        {         
            return View("somethingfordiv1", ModelForDiv1);
            return View("somethingfordiv2", ModelForDiv2); //i want also return another view here
        }
     }

в этом вызове ajax на контроллере я хочу вернуть 2 разных представления для 2 разных div.
еще раз спасибо :)

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Вот один способ, которым вы могли бы продолжить. Вы можете объединить две модели представления в уникальную модель представления и затем заставить действие контроллера вернуть представление, содержащее javascript, который вставит результаты двух представлений в разные элементы div.

Как всегда, начнем с просмотра моделей:

public class Model1 { }
public class Model2 { }

public class AggregatedModel
{
    public Model1 Model1 { get; set; }
    public Model2 Model2 { get; set; }
}

Затем контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult SomeAction()
    {
        var model = new AggregatedModel
        {
            Model1 = new Model1(),
            Model2 = new Model2()
        };
        Response.ContentType = "text/javascript";
        return PartialView(model);
    }
}

Тогда соответствующий ~/Views/Home/Index.cshtml просмотр:

<div id="menu">
    @Html.ActionLink("click me", "SomeAction", "Home", new { id = "clickme" })
</div>

<div id="div1">bla bla content</div>
<div id="div2">bla bla content</div>

<script type="text/javascript">
    $('#clickme').click(function () {
        $.getScript(this.href);
        return false;
    });
</script>

Следующее представление ~/Views/Home/SomeAction.cshtml:

@model AggregatedModel
$('#div1').html(@Html.Raw(Json.Encode(Html.Partial("Model1", Model.Model1).ToHtmlString())));
$('#div2').html(@Html.Raw(Json.Encode(Html.Partial("Model2", Model.Model2).ToHtmlString())));

и, наконец, два ~/Views/Home/Model1.cshtml и ~/Views/Home/Model2.cshtml просмотров:

@model Model1
<span>This is the contents for model1</span>

и

@model Model2
<span>This is the contents for model2</span>
0 голосов
/ 18 мая 2011

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

Вы также можете использовать viewdata, чтобы отдельно иметь эту возможность.

Html.RenderAction также доступен, но имитирует еще один полный запрос


Для вашего ajax-запроса вы можете вернуть html-фрагмент из рендеринга частичного представления, и это можно определить с помощью Request.IsAjaxRequest. Тогда ваш javascript может установить результат в документе.

Это в твоих действиях

if (Request.IsAjaxRequest())
{
    return View("PartialViewName", partialModel);
}
return View("NormalView", normalModel);

И пример на стороне клиента (с использованием jquery)

    function hijack(form) {
        $("div#SearchResults").html("");
        $("div#SearchResults").addClass('loading');

        $.ajax({
            url: form.action,
            type: form.method,
            dataType: "html",
            data: $(form).serialize(),
            success: function(data) {
                $("div#SearchResults").removeClass('loading');
                $("div#SearchResults").html(data);
            }
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...