MVC передает объект модели из контроллера для просмотра - PullRequest
1 голос
/ 29 октября 2010

Я пытаюсь выяснить, как передать объект модели из контроллера для просмотра в следующем сценарии:

<% Html.Action("GetRequest", "The_Controller", new { requestId = 12 }); %>
<% Html.RenderPartial("Request", ViewData.Model); %>

Действие должно, и оно вызывает метод контроллера, который ищет запрособъект в хранилище БД и возвращает объект запроса.

Частичное представление с именем Request должно получить объект запроса и отобразить его.

Проблема заключается в том, что ViewData.Model всегда имеет значение null?!

Я пытался выяснить это, но безуспешно: (

Причина такого поведения в том, что мне нужно отобразить частичное представление внутри модального диалога jQuery на основеЗначение requestId, предоставленное jQGrid. Я достиг точки, где я открываю диалоговое окно, но не могу получить экземпляр этого объекта модели.

Любая помощь приветствуется.

РешениеС помощью Ника Ларсена и Дарина Димитрова

Контроллер:

    [AcceptVerbs(HttpVerbs.Post)]
    [Authorize]
    public PartialViewResult GetRequest(string requestId)
    {
        Request request = DatabaseContext.GetRequest(Convert.ToInt32(requestId)) as Request;
        return PartialView("Request", request);
    }

Javascript вида:

function OpenRequest(requestId) {

        var methodName = '<%= Url.Content("~")%>' + 'Controller/GetRequest/';
        var dataType = "html";
        var postData = { requestId: requestId };
        var contentType = "application/x-www-form-urlencoded"; ;
        var request = ContactServer(methodName, postData, dataType, contentType);

        $("#dialog").html(request);
        $("#dialog").dialog({ html: request, title: 'Request details...', width: 800, height: 600, modal: true, zindex: 300000, show: 'scale', resizable: false });

    }

Ответы [ 3 ]

2 голосов
/ 30 октября 2010

Вы можете сделать так, чтобы действие контроллера вернуло частичное представление:

<%= Html.Action("GetRequest", "The_Controller", new { requestId = 12 }) %>

А в вашем контроллере действие:

public ActionResult GetRequest(int requestId)
{
    var request = _repository.GetRequest(requestId);
    return PartialView("Request", request);
}

Таким образом, действие GetRequest передаст объект запроса строго типизированному частичному представлению Request.ascx и включит его на страницу в месте, которое вы назвали Html.Action helper.

1 голос
/ 29 октября 2010

Кажется, что у вас есть вся необходимая информация, чтобы создать объект «Запрос» в вашем начальном методе действия контроллера.

Предположим, что:

  • сбросить <% Html.Action("GetRequest", "The_Controller", new { requestId = 12 }); %> в целом. Мы будем предварительно заполнять ViewData всеми данными, необходимыми для отправки в Partial.

  • в вашем начальном методе контроллера вы создаете новую запись ViewData, возможно, ViewData["SomeRequest"]

  • предварительно заполните это, как вам нужно в начальном методе контроллера, используя requestId = 12 и email = "foo@bar", и все другие соответствующие элементы для создания объекта «Запрос», или чего-либо еще, что необходимо в частичном представлении с именем « Запрос».

    т.е. ViewData["SomeRequest"]= dbRepository.GetRequestById(intrequestId);

  • в вашем представлении, позвоните Html.RenderPartial("Request", ViewData["SomeRequest"]);

1 голос
/ 29 октября 2010

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

Что касается вашей актуальной проблемы. Действие, которое вызывает это представление в первую очередь, заполняет ViewData.Model для его контекста. Когда вы вызываете метод действия, платформа создает новый контекст со своими собственными данными ViewData, к которым у вас нет доступа без дескриптора к этому вновь созданному контексту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...