如何在ASP.NET MVC中向部分视图传递参数?

97

假设我有这个部分视图:

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

这可以通过子元素操作访问,例如:

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

}

我想在另一个视图中使用这个局部视图:

@Html.RenderPartial("FullName")

换句话说,我想要能够从视图传递firstName和lastName到局部视图。我应该怎么做?


非常相关的问题:https://dev59.com/_HI-5IYBdhLWcg3wVWvv - Chris Moschini
8个回答

94

如果您想使用ViewData,这里有另一种方法:

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

要检索传入的值:

@{
    string valuePassedIn = this.ViewData.ContainsKey("VariableName") ? this.ViewData["VariableName"].ToString() : string.Empty;
}

1
谢谢,你的答案解决了问题,而且不需要为此创建一个模型。 - alvarodms
在所有的例子中,这是唯一一个完全适用于我的。谢谢。 - BrianLegg
优秀的回答 - 但是在MVC 4中使用Html.RenderPartial而不是Html.Partial。 - Graham Laight
1
我必须使用new ViewDataDictionary(ViewData) {来使其正常工作:https://dev59.com/aVkS5IYBdhLWcg3wCCXf#43136848 所以:await Html.RenderPartialAsync("~/PathToYourView.cshtml", null, new ViewDataDictionary(ViewData) { { "VariableName", "some value" } } ); - SharpC
@SharpC,它解决了在viedatadictionary中显示的错误,但我无法在部分视图中获取该值。 - sumitkhatrii
显示剩余2条评论

81

使用这个重载版本 (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
23
你这样传递参数,如何在部分视图中访问它? - Burjua
10
你不需要使用括号。@Html.Partial()@{Html.RenderPartial();} 是相同的,但前者更简洁美观。它们也有相同的参数重载。 - smdrager
7
如何访问对象?Model.firstName及类似的方式会抛出异常,指出“对象没有'firstName'属性”。 - ashes999
4
@ashes999 您可以通过 ViewData 访问...但是为了保持内容整洁,最好创建一个特定于您使用的模型。如果只使用一次,有些人可能会考虑这是个抛硬币的决定,但如果使用多次,这将是一个明智的选择。 - Ted
显示剩余5条评论

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


15

请确保在 Html.RenderPartial 周围添加 {},例如:

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

不是

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

2
你的Partial View的定义是什么样子的?@model声明是什么?它是匿名的... - Elisabeth
是的,请确保添加 { },我浪费了很多时间,直到我找到了这篇文章 - Shaiju T

7
以下是适用于我在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);

0
@{
            Html.RenderPartial("_partialViewName", null, new ViewDataDictionary { { "Key", "Value" } });
        } 

在您想显示局部视图的地方,
 @{
    string valuePassedIn = this.ViewData.ContainsKey("Key") ? this.ViewData["Key"].ToString() : string.Empty;
}

在渲染PartialView时,

使用传递进来的值 --> @valuePassedIn


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案 - Emmanuel Ponnudurai

0

我刚看到这个问题,我有类似的情况。

我的问题如下: 我有多个变量需要传递给我创建的局部视图。

我创建的解决方案是:

@{
await Html.RenderPartialAsync("YourPartialViewName",new { NumberOfProducts = ViewData["NumberOfProducts"], UserName = ViewData["UserName"] });
}

在上述代码中,我创建了一个匿名对象并将其发送到视图,下面的代码是为了解释如何检索通过此对象发送的数据。

     <span>
          @Model.UserName
      </span>

     <span>
          @Model.NumberOfProducts
      </span>

希望这可以帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接