2014-05-05 3 views
0

Новое в 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> 

Мой Частичный вид на конце, по существу, еще детали просмотра, а от модели оружия. Моя цель - показать персонажа и оружие, которыми он владеет на одном представлении, но я получаю сообщение об ошибке из-за конфликтующих типов моделей. Есть ли способ обойти это?

+0

Мне нравится загружать частичные части, подобные этому через вызов ajax. см. мой ответ здесь http://stackoverflow.com/questions/23340245/how-to-pass-id-in-jquery/23343088#23343088 для примера этого метода –

+0

Я, к сожалению, знаю еще меньше Ajax, чем MVC = (Вы пытаетесь разобраться в своем примере, но это ускользает от меня. –

ответ

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

2

Помимо использования шаблонов Editor/Display, вы можете сделать это двумя различными способами:

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

Использование шаблонов редактора или дисплея облегчает работу, но менее гибкое. Это зависит от того, что вам нужно достичь, или того, что вы уже получили.

Edit: о «гибкости»

Чтобы быть более точным, редактором или Display шаблон похож на рендер частичное, с differece, что шаблон отображения автоматически выбирается в зависимости от типа модели.

Например, если определить тип, как «Продолжительность», который включает в себя часы и минуты свойства, вы можете создать

  • шаблон редактора, чтобы показать его как «чч: мм»
  • шаблон медийного , что позволяет вводить значение в виде «hh: mm» в текстовое поле.

Это здорово, потому что всякий раз, когда вы хотите изменить этот вид значения вы можете рассчитывать в Html.EditorFor или Html.DisplayFor, чтобы получить этот шаблон, без каких-либо дополнительных работ. И это действительно полезно, потому что у вас может быть модель с несколькими объектами Duration, и они автоматически получат «автоматическую» привязку.

Однако, если у вас более сложная модель со многими свойствами внутри нее, вполне вероятно, что вы хотите показать их по-разному. Например,

  • в зависимости от прав доступа пользователя, вошедшего в систему или на какой-то бизнес-логики, Кроме того, он может быть neccesary показать редактор с некоторыми читать только элементы управления, или отображать только часть значений
  • в зависимости на том месте, где вы его показываете (на полной странице, внутри диалогового окна jQuery UI, как деталь на другой странице ...), вам могут потребоваться разные макеты.

Очевидно, что в этом случае шаблон редактора/дисплея будет жестким.

Определенно, если вы всегда будете показывать или редактировать модель точно так же, используйте шаблоны редактора/отображения. Если нет, RenderPartial или RenderAction предоставит необходимую гибкость.

(ПРИМЕЧАНИЕ: можно настроить шаблоны дисплея и редактора, передавая им дополнительные данные, но реализовать это нормальное представление/действие намного сложнее).

+0

Почему вы говорите, что шаблоны менее гибкие? Они чрезвычайно гибкие и позволяют создавать рендеринг на основе типа. Попробуйте получить частичные для автоматического выбора правильного частичного рендеринга на основе тип. –

+0

Я отредактировал свой ответ, чтобы объяснить это мнение. – JotaBe

+0

Умм .. вы понимаете, что у EditorTemplates есть поле «дополнительные данные», чтобы передать им .... –

Смежные вопросы