Як передати параметри частковому поданню в ASP.NET MVC?


93

Припустимо, що я маю такий частковий погляд:

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

який доступний лише через дію, наприклад:

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

}

І я хочу використовувати цей частковий вигляд всередині іншого подання з:

@Html.RenderPartial("FullName")

Іншими словами, я хочу мати можливість передавати ім’я та прізвище з подання в часткове. Як мені це зробити?


Дуже тісно пов’язане запитання: stackoverflow.com/questions/1909134/…
Кріс Москіні,

Відповіді:


77

Використовуйте це перевантаження ( 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

18
Отже, ви передали такий параметр, як отримати доступ до нього у частковому поданні?
Бурджуа,

9
Вам також не потрібні дужки. @Html.Partial()це те ж саме, @{Html.RenderPartial();}але набагато красивіше. Вони мають такі ж перевантаження.
smdrager

7
Як ви отримуєте доступ до об’єкта? Model.firstNameі їх подібні кидають виняток, якийobject doesn't have a 'firstName' property
ashes999

4
@ ashes999, до якого ви можете отримати доступ через ViewData ... але допоможіть підтримувати порядок, просто створивши модель, специфічну для вашого використання. Використовуйте його один раз, і деякі можуть вважати це підкиданням, але використовуйте його більше разів, ніж це, і це ні до чого.
Тед,

84

Ось ще один спосіб зробити це, якщо ви хочете використовувати 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
Graham Laight

24

Вам потрібно створити модель подання. Щось подібне повинно робити ...

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відповідно.


13

обов’язково додайте {} навколо Html.RenderPartial, як:

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

ні

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

1
Як виглядає визначення вашого часткового вигляду? Що таке декларація @model? Це анонімно ...
Елізабет

так, не забудьте додати { }, я даремно витратив час, поки не знайшов цю статтю
shaijut

4

Для мене на dotnet 1.0.1 працює наступне :

./ourView.cshtml

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

./_ourPartial.cshtml

<h1>@this.ViewData["hi"]</h1>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.