将一个模型类型的局部视图渲染到另一个模型类型的视图中

时间:2014-05-05 16:06:27

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

MVC的新手,我无法理解所提出的类似问题的答案,所以如果这是人们的重复,请道歉。

我有一个使用角色模型的详细信息视图:

@model Attacker.Models.Character

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
    <h4>Character</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Name)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Name)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Str)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Str)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Con)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Con)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Dex)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Dex)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Int)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Int)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Wis)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Wis)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Cha)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Cha)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.BaseAttack)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.BaseAttack)
        </dd>
    </dl>
</div>
   @Html.Partial("~/Views/Shared/_Weapons.cshtml")
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.CharacterID }) |
    @Html.ActionLink("Back to List", "Index")
</p>

我最后的部分视图本质上是另一个细节视图,但来自武器模型。我的目的是在一个视图上显示他拥有的角色和武器,但由于模型类型的冲突,我得到了错误。

有解决方法吗?

2 个答案:

答案 0 :(得分:2)

除了使用编辑器/显示模板之外,您还可以通过两种不同的方式实现:

  1. 在你的Attacker.Models.Character中包含一个武器模型列表,并在这样的循环中渲染它们:

    @foreach(weaponModel in Model.Weapons) { Html.RenderPartial("", weapon); }

  2. 创建一个动作以按ID(或您想要使用的任何键)显示武器。在模型中包含武器键,并为每个武器渲染动作(此示例假定ShowWeapon是同一控制器中的动作,但您当然可以通过指定它来使用另一个控制器):

    @foreach(weaponId in Model.WeaponIds) { Html.RenderAction("ShowWeapon", new {id = weaponId}); }

  3. 使用编辑器或显示模板可以简化操作,但灵活性较差。这取决于您需要实现的目标,或者您已经拥有的内容。

    编辑:关于&#34;灵活性&#34;

    更准确地说,编辑器或显示模板类似于渲染部分,其差异在于根据模型类型自动选择视图模板。

    例如,如果您定义类似&#39;持续时间&#39;其中包括小时和分钟属性,您可以创建

    • 一个编辑模板,将其显示为&#34; hh:mm&#34;
    • 一个显示模板,允许输入值为&#34; hh:mm&#34;在文本框中。

    这很棒,因为每当您想要编辑此类值时,您都可以依赖Html.EditorForHtml.DisplayFor来获取此模板,而无需任何额外的工作。这非常有用,因为您可以拥有一个具有多个Duration属性的模型,并且他们可以自动获得&#34;以正确的方式约束。

    但是,如果你有一个更复杂的模型,里面有很多属性,你很可能想以不同的方式显示它们。例如,

    • 取决于登录用户或某些业务逻辑的权限,此外,可能需要向编辑器显示一些只读控件,或仅显示部分值
    • 取决于您显示它的位置(在整个页面中,在jQuery UI对话框中,作为另一个页面中的详细信息......)您可能需要不同的布局。

    显然,在这种情况下,编辑/显示模板将是僵硬的。

    当然,如果您始终以完全相同的方式显示或编辑模型,请使用编辑器/显示模板。如果没有,RenderPartialRenderAction将提供所需的灵活性。

    (注意:可以自定义显示和编辑模板向其传递额外数据,但实现普通视图/操作要困难得多。)

答案 1 :(得分:0)

是的,不要使用Partials。请改用编辑器或显示模板。我现在没有时间写完整的回复,如果他们想要,其他人可以自由...这些链接现在应该有所帮助。

http://blogs.msdn.com/b/nunos/archive/2010/02/08/quick-tips-about-asp-net-mvc-editor-templates.aspx http://www.growingwiththeweb.com/2012/12/aspnet-mvc-display-and-editor-templates.html http://www.codeproject.com/Articles/672591/Exploring-Display-and-Editor-Templates-in-ASP-NET