Попробуйте получить доступ к свойству родительской 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. Надеюсь это поможет