如何在MVC 4中将参数传递给局部视图


152

我有这样的链接:

 <a href='Member/MemberHome/Profile/Id'><span>Profile</span></a>

当我单击它时,它将称为此部分页面:

 @{
    switch ((string)ViewBag.Details)
    {

        case "Profile":
        {
           @Html.Partial("_Profile"); break;
        }

    }
}

部分页面_Profile包含:

Html.Action("Action", "Controller", model.Paramter) 

例:

@Html.Action("MemberProfile", "Member", new { id=1 })   // id is always changing

我的疑问是如何将这个“ Id”传递给model.parameter部分

我的控制器是:

 public ActionResult MemberHome(string id)
    {
        ViewBag.Details = id;
        return View();
    }
  public ActionResult MemberProfile(int id = 0)
    {
        MemberData md = new Member().GetMemberProfile(id);
        return PartialView("_ProfilePage",md);
    }

2
我不明白 也许如果您添加控制器并采取措施可能会有所帮助,但是如本文所述,我不理解您的问题。
利亚姆

请参见msdn上的部分扩展
Grundy

Answers:


346

您的问题很难理解,但是如果要理解的话,您只是想在主视图中具有一些价值,就可以在该视图的部分渲染中访问它。

如果仅使用部分名称渲染部分:

@Html.Partial("_SomePartial")

实际上,它将作为隐式参数传递您的模型,就像您要调用的一样:

@Html.Partial("_SomePartial", Model)

现在,为了使您的部分人能够实际使用它,它也需要具有定义的模型,例如:

@model Namespace.To.Your.Model

@Html.Action("MemberProfile", "Member", new { id = Model.Id })

另外,如果您要处理的值不在视图模型中(该值在ViewBag中或在视图本身中生成),则可以传递一个 ViewDataDictionary

@Html.Partial("_SomePartial", new ViewDataDictionary { { "id", someInteger } });

然后:

@Html.Action("MemberProfile", "Member", new { id = ViewData["id"] })

与该模型一样,Razor ViewData默认情况下会隐式地将局部视图传递给您的局部视图,因此,如果您ViewBag.Id的视图中有视图,则可以在局部视图中引用相同的内容。


4
如果使主模型实现接口,则可以让部分视图使用该接口作为模型。然后,您可以充分利用它。
杰西2014年

一如既往:)投票+ @ChrisPratt很解释性回答
穆拉特·耶尔德兹

6
我必须使用@Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });它来为我工作。如果有人遇到相同问题,我正在使用VS2015 DNX 4.5.1。
MikeTeeVee

46

我在搜索自己时发现的用于单个值的最短方法之一,就是像这样传递单个字符串并将字符串设置为模型。

在您的部分通话方

@Html.Partial("ParitalAction", "String data to pass to partial")

然后像这样用Partial View绑定模型

@model string

并像这样在Partial View中使用它的值

@Model

您还可以使用其他数据类型(例如数组),int或更复杂的数据类型(例如IDictionary或其他类型)。

希望能帮助到你,


4
这很整齐!正是我想要的。谢谢。
Gautam Jain

我的partial不需要我的模型,但是我需要保留所有ViewData ModelState的东西。在我的局部视图中,我仍然可以访问ViewContext.ViewData.ModelState.ContainsKey(@ Model.ToString())
da_jokker

这样会不断抛出NullReferenceException未设置为对象实例的对象引用,Model即为null。有任何想法吗?
facepalm42

15

这是将对象转换为ViewDataDictionary的扩展方法。

public static ViewDataDictionary ToViewDataDictionary(this object values)
{
    var dictionary = new ViewDataDictionary();
    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(values))
    {
        dictionary.Add(property.Name, property.GetValue(values));
    }
    return dictionary;
}

然后可以在视图中使用它,如下所示:

@Html.Partial("_MyPartial", new
{
    Property1 = "Value1",
    Property2 = "Value2"
}.ToViewDataDictionary())

这比new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}语法要好得多。

然后,在局部视图中,您可以ViewBag用来访问动态对象的属性,而不是索引属性,例如

<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>

我应该在哪里放置此ToViewDataDictionary静态方法?我在任何地方放它都会遇到某种编译器错误。
Csaba Toth

2
@CsabaToth这是扩展方法。只需将其放在静态类中,然后在您的视图中引用该类。
克里斯·海恩斯

3

对于Asp.Net核心,您最好使用

<partial name="_MyPartialView" model="MyModel" />

所以举个例子

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.