在部分视图中获取变量

时间:2014-04-04 14:58:56

标签: c# asp.net-mvc razor

假设我将数据传递给像这样的部分视图

@Html.Partial("_LandingPage_CaseStudiesList", new { TrackAction = "Case Study Click", CaseStudies = Model.CaseStudies  })

如何获取部分数据?

我尝试了Model["TrackAction"]Model.TrackAction,但都没有工作,我也不知道还有什么可以尝试。

如果我调试代码,我可以看到属性但只是不知道如何使用它们来恢复它们

这是我的部分

<ul id="case-studies-list" class="table">

@{
    int counter = 1;
    foreach (Asset caseStudy in caseStudies)
    {

        <li class="@(counter == 1 ? "first " : string.Empty)cell">
            <a href="@caseStudy.Url" class="track-event" data-action="@trackAction" data-label="Case Study Download" data-value="@caseStudy.Name" target="_blank">
                <span class="sprite @string.Format("case-study{0}", counter)"></span>
                <span class="text">
                    @Html.Raw(caseStudy.Name)<br />
                    <span class="font11">@Html.Raw(caseStudy.Location)</span>
                </span>
            </a>
        </li>

        counter++;
    }
}

</ul>

这是我调试时得到的图像:http://i.imgur.com/OiReWZv.gif

2 个答案:

答案 0 :(得分:5)

您可以按照问题的方式将匿名对象作为模型传递给部分视图:

@Html.Partial("_LandingPage_CaseStudiesList", new { TrackAction = "Case Study Click", CaseStudies = "fsdffd" })

然后在局部视图中有几个选项:

  1. 不要在视图中声明模型(即不要包含声明 比如顶部的@model MyModel

  2. 将模型声明为动态(即包含@model dynamic之类的语句

  3. 在这两种情况下,您都应该能够像

    一样访问您的媒体资源
    @Model.TrackAction
    @Model.CaseStudies 
    

    此外,您的视图文件中不会有智能感知,如果模型中不存在该属性,您将在运行时收到异常。

答案 1 :(得分:2)

定义局部视图时,您可以定义将用作其数据上下文的类。即:

@model SomeViewModel

MVC要求这是一个具体的类型。因此,我建议在项目中创建一个名为ViewModels的文件夹,并创建一个类来保存您的信息。所以举个例子:

public class MyViewModel
{
    public string TrackAction { get; set; }
    public string CaseStudies { get; set; }
}

您可以在定义部分视图时使用,如下所示:

@Html.Partial("_LandingPage_CaseStudiesList", new MyViewModel{ TrackAction = "Case Study Click", CaseStudies = Model.CaseStudies })

如果您不想使用viewmodel,那么我建议您查看ViewBags等其他方法。