Как отправить объект модели в Html.RenderAction (MVC3) - PullRequest
23 голосов
/ 22 января 2012

Я использую бритву MVC3, и я пытаюсь передать объект в частичное представление, и он не работает.

Это прекрасно работает, не отправляя объектную модель в частичное представление:

Html.RenderAction("Index", "ViewName");

Попытка этого не отправляет объект модели, вместо этого я получаю пустые значения (объект имеет данные, и представление ожидает их): '

Html.RenderAction("Index", "ViewName", objectModel);

Возможно ли это вообщеиспользуя RenderAction?

Спасибо!

Редактировать: Я обнаружил ошибку, произошла ошибка в действии контроллера, которое не подняло отправленный объект.Спасибо за вашу помощь!

Ответы [ 3 ]

33 голосов
/ 03 мая 2013

Вы можете фактически передать объект в метод контроллера, используя Action. Это можно сделать в любом доступном представлении, например, у меня есть одно в общей библиотеке, которая создается для папок бина проекта, которые ссылаются на мой общий проект (свойства - Копировать, если новее, в файле представления в Visual Studio). Это делается так:

Контроллер:

public class GroovyController : Controller
{
    public ActionResult MyTestView(MyModel m)
    {
        var viewPath = @"~\bin\CommonViews\MyTestView";
        return View(viewPath, m);
    }
}

Страница MVC (с использованием синтаксиса Razor):

@Html.Action("MyTestView", "Groovy", new { m = Model })

или используя RenderAction метод:

@{ Html.RenderAction("MyTestAction", "MyTestController", new { area = "area", m = Model }); }

Примечание: в @Html.Action() объект Model должен иметь тип MyModel, а для этого 3-го параметра должно быть задано имя переменной контроллера, из которых у меня значение MyModel m. m - это то, что вы должны назначить, поэтому я делаю m = Model.

25 голосов
/ 22 января 2012

говорят, что вы хотите передать foo как модель, сделайте это первым

public class Foo {
    public string Name { get; set; }
    public int Age { get; set; }
}

теперь создайте ActionResult

public ActionResult FooBar(Foo _foo){
    return PartialView(_foo);
}

назовите это

@Html.RenderAction("FooBar", "Controller", new { Name = "John", Age=20 });
6 голосов
/ 06 февраля 2013

Обычно, если у меня уже есть модель, имеет смысл использовать Html.Partial, чем пытаться выполнить действие.

@Html.Partial("Foo", Model.FooModel)

Где Foo.cshtml - это файл вида (возможно, в вашей общей папке), строго напечатанный с помощью @model FooProject.Models.FooModel или как называется ваша модель. Это может быть настолько сложная модель, насколько вам нужно. Модель - это основная модель вашей страницы, в которую вы должны установить FooModel - или просто пропустить этот параметр, если представление Foo использует ту же модель, что и родительская страница.

RenderAction, как правило, лучше, когда у вас есть просто простые параметры, потому что вы просто имитируете запрос к обычному действию, которое имеет параметры строки маршрутизации / запроса, а затем выгружаете этот ответ на вашу страницу. Это хорошо работает, если вам нужно поместить что-то в макет, который недоступен в модели вашей страницы, например элемент на боковой панели.

...