Попробуйте получить доступ к свойству родительской viewmodel в displaytemplate

Я пытаюсь создать приложение asp.net mvc 4, которое использует частичные представления и display/editortemplates и Kendo ui. У меня есть viewmodel для конкретной страницы:

public class Plant {
    public Guid PlantId{ get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public ICollection<Leaf> Leafs{ get; set; }
    public ICollection<Flower> Flowers{ get; set; }
    public ICollection<Bug> Bugs{ get; set; }
}

А также Leaf, Flower и Bug имеют свои свойства. К примеру:

public class Leaf {
    public Guid LeafId{ get; set; }
    public string Name { get; set; }
    public string Documentation { get; set; }
    public string Description { get; set; }
}

Я использую частичные представления в моем представлении, чтобы упростить их обновление с помощью ajax. Мой обычный вид: PlantDetail.cshtml

@model Plant

<table>
<tr>
    <td>
        <h2>@Html.Label(Resources.PlantDetailTitle)</h2>
    </td>
    <td>
        @Html.HiddenFor(m => m.PlantId)
        @Html.DisplayFor(m => m.Name)
    </td>
</tr>
<tr>
    <td>@Html.LabelFor(m => m.Description)
    </td>
    <td>
        @Html.DisplayFor(m => m.Description)
    </td>
</tr>
</table>

 @{Html.RenderPartial("_flowers", Model);}

 @{Html.RenderPartial("_leafs", Model);}

В моем частичном представлении "_leafs" (а также в "_flowers" у меня есть серия кнопок, которые вызывают действие, для которого требуется LeafId и PlantId:

Частичное представление "_leafs":

 @model List<Leaf>

 @for (int i = 0; i < Model.Count(); i++ )
  {
  @(Html.DisplayFor(m => m[i]))
 }

Мой шаблон отображения "Leaf.cshtml":

  @model Leaf
  @Html.HiddenFor(m =>m.LeafId)
   <a class='k-button k-button-icontext' href=@Url.Action("InitiateLeaf", "Plant") +"?    
  leafId=@Model.LeafId&plantId=#=PlantId#">@Model.Name</a>

Теперь моя проблема в том, что я не могу получить доступ к PlantId моей родительской модели представления в моей шаблонной табличке. (И у меня та же проблема в каждой из моих displaytemplates..) Я уже пробовал это с значениями маршрута в моем url.action, и я знаю, что в конечном итоге я могу получить доступ к PlantId в javascript, но есть ли какой-либо (mvc) способ продолжайте использовать displaytemplates и не дублируйте мой plantId как свойство моего дочернего листа viewmodel?

Я уже пытался получить доступ к своему родительскому контексту с помощью чего-то вроде "@HttpContext.Current.Request.RequestContext.RouteData.Values ​​["controller"].ToString()" в моей displaytemplate, но не похоже, чтобы найти значение моего PlantId (если он там даже хранится..).

У кого-нибудь еще есть предложения?

1 ответ

Решение

Как вы упомянули, один из вариантов - использовать jquery для доступа к родительскому PlantId. Если у вас есть требование для доступа к свойствам вашего родителя, лучше спроектировать модели представлений, аналогично тому, как среда Entity рекомендует нам создавать классы моделей.

public class Plant {
    public Guid PlantId{ get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public ICollection<Leaf> Leafs{ get; set; }
    public ICollection<Flower> Flowers{ get; set; }
    public ICollection<Bug> Bugs{ get; set; }
}

Таким образом, ваш класс Leaf также должен иметь навигационное свойство, чтобы вернуться к Plant.

public class Leaf {
    public Guid LeafId{ get; set; }
    public string Name { get; set; }
    public string Documentation { get; set; }
    public string Description { get; set; }
    public virtual Plant Plant { get; set; }
    public Guid PlantId { get; set; }
}

Убедитесь, что вы заполнили свойство Plant и PlantId при создании ViewModel. Надеюсь это поможет

Другие вопросы по тегам