【问题标题】:How can I pass parameters to a partial view in mvc 4如何将参数传递给 mvc 4 中的局部视图
【发布时间】:2014-01-14 23:37:44
【问题描述】:

我有一个这样的链接:

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

当我点击它时,它会调用这个部分页面:

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

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

    }
}

部分页面_配置文件包含:

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);
    }

【问题讨论】:

  • 我不明白。也许如果您添加控制器和操作可能会有所帮助,但正如现在所写的那样,我不明白您的问题。
  • 在 msdn 上查看Partial 扩展

标签: asp.net-mvc asp.net-mvc-4 razor partial-views


【解决方案1】:

你的问题很难理解,但如果我明白了要点,你只是在你的主视图中有一些价值,你想在该视图中呈现部分内容时访问它。

如果您只使用部分名称渲染部分:

@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,那么您可以在局部视图中引用相同的内容。

【讨论】:

  • 如果你让你的主模型实现一个接口,你可以让局部视图使用那个接口作为一个模型。然后你可以从中得到很多重用。
  • @ChrisPratt 一如既往的非常解释性的答案:) 投票+
  • 我必须使用 @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } }); 才能为我工作。如果其他人有同样的问题,我正在使用 VS2015 DNX 4.5.1。
【解决方案2】:

这是一个将对象转换为 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静态方法放在哪里?无论我试图把它放在哪里,我都会遇到某种编译器错误。
  • @CsabaToth 这是一种扩展方法。只需将它放在一个静态类中,然后在您的视图中引用该类。
【解决方案3】:

我在搜索自己时为单个值找到的最短方法之一就是像这样传递单个字符串并将字符串设置为视图中的模型。

在您的部分调用方

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

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

@model string

以及像这样在局部视图中使用它的值

@Model

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

希望对你有帮助,

【讨论】:

  • 这很好!正是我想要的。谢谢。
  • 我的部分不需要我的模型,但我需要保留所有 ViewData ModelState 的东西。这成功了。在我的部分视图中,我仍然可以访问 ViewContext.ViewData.ModelState.ContainsKey(@Model.ToString())
  • 这不断抛出NullReferenceException,对象引用未设置为对象的实例,这表示Model 为空。有什么想法吗?
  • 好的,我有点过早地赞成这个。当我尝试这个时,我收到一条消息,我正在尝试将视图模型传递给局部视图,但它需要一个字符串。我很确定我在做正确的事。我最终创建了一个包含单个文本属性的简单局部视图模型来解决此问题(并将其传递给局部视图),因为它浪费了太多时间。
【解决方案4】:

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

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

例如

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2013-02-15
    • 2015-09-15
    • 1970-01-01
    • 2011-10-04
    • 2010-12-26
    • 1970-01-01
    相关资源
    最近更新 更多