Как передать параметры в частичное представление в ASP.NET MVC?

94

Предположим, у меня есть это частичное представление:

Your name is <strong>@firstName @lastName</strong>

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

[ChildActionOnly]
public ActionResult FullName(string firstName, string lastName)
{

}

И я хочу использовать это частичное представление внутри другого представления с:

@Html.RenderPartial("FullName")

Другими словами, я хочу иметь возможность передавать firstName и lastName из представления в частичное представление. Как мне это сделать?

Саид Нямати
источник
Очень близкий вопрос: stackoverflow.com/questions/1909134/…
Крис Москини

Ответы:

78

Используйте эту перегрузку ( RenderPartialExtensions.RenderPartialв MSDN ):

public static void RenderPartial(
    this HtmlHelper htmlHelper,
    string partialViewName,
    Object model
)

так:

@{Html.RenderPartial(
    "FullName",
    new { firstName = model.FirstName, lastName = model.LastName});
}
Дэвид Уик
источник
1
Ну, попробовал, но я получаю . Лучшее совпадение перегруженного метода для «System.Web.WebPages.WebPageExecutingBase.Write (System.Web.WebPages.HelperResult)» имеет некоторую ошибку неверных аргументов . Как мне реализовать метод контроллера? Должны ли быть входные параметры?
Saeed Neamati 01
19
Итак, вы передали такой параметр, как получить к нему доступ в частичном представлении?
Burjua
9
Вам также не нужны скобки. @Html.Partial()то же самое, @{Html.RenderPartial();}но намного красивее. У них тоже есть такие же перегрузки.
smdrager
7
Как получить доступ к объекту? Model.firstNameи их как выбросить исключение,object doesn't have a 'firstName' property
ashes999
4
@ ashes999 вы можете получить доступ через ViewData ... но помогите сохранить порядок, просто создав модель, специфичную для вашего использования. Используйте его один раз, и некоторые могут посчитать это подбрасыванием, но используйте его несколько раз, и это не проблема.
Ted
85

Вот еще один способ сделать это, если вы хотите использовать ViewData:

@Html.Partial("~/PathToYourView.cshtml", null, new ViewDataDictionary { { "VariableName", "some value" } })

И чтобы получить переданные значения:

@{
    string valuePassedIn = this.ViewData.ContainsKey("VariableName") ? this.ViewData["VariableName"].ToString() : string.Empty;
}
Гарри Инглиш
источник
Спасибо, ваш ответ помог без создания модели для этого.
alvarodms
Из всех примеров это единственный, который у меня полностью сработал. спасибо
BrianLegg
Это то, что я искал, без модели. спасибо :)
Анупам Рой
Отличный ответ - но с MVC 4 используйте Html.RenderPartial вместо Html.Partial
Грэм Лэйт
25

Вам необходимо создать модель просмотра. Что-то вроде этого должно быть ...

public class FullNameViewModel
{
     public string FirstName { get; set; }
     public string LastName { get; set; }

     public FullNameViewModel() { } 

     public FullNameViewModel(string firstName, string lastName)
     {
          this.FirstName = firstName;
          this.LastName = lastName;
     }

}

затем из результата вашего действия передайте модель

return View("FullName", new FullNameViewModel("John", "Doe"));

и вы сможете получить доступ @Model.FirstNameи @Model.LastNameсоответственно.

simonlдети
источник
14

убедитесь, что вы добавили {} вокруг Html.RenderPartial, как:

@{Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});}

не

@Html.RenderPartial("FullName", new { firstName = model.FirstName, lastName = model.LastName});
ЧерныйTigerX
источник
1
Как выглядит определение вашего частичного просмотра? Что такое объявление @model? Его анонимный ...
Элизабет
да, не забудьте добавить { }, я зря потратил время, пока не нашел эту статью
Shaijut
5

Для меня в dotnet 1.0.1 работает следующее :

./ourView.cshtml

@Html.Partial(
  "_ourPartial.cshtml",
  new ViewDataDictionary(this.Vi‌​ewData) {
    {
      "hi", "hello" 
    } 
  }
);

./_ourPartial.cshtml

<h1>@this.ViewData["hi"]</h1>
озеро
источник
1

Только:

@Html.Partial("PartialName", Model);
Касио Батиста Перейра
источник