Rendu d'une vue partielle en deux différents points de vue fortement typé
-
27-09-2019 - |
Question
J'ai vue fortement typé Personne, que je veux rendre une partie dans:
Person View (fortement typé comme personne)
<label for="name">Name</label>
<% Html.RenderPartial("AddressForm"); %>
</label>
Voir AddressForm (typées, parce que je veux aussi l'utiliser dans le distributeur vue fortement typé)
Quand je tente d'appeler cette partie de la vue personne, je reçois cette erreur:
Compiler Message d'erreur: CS1963: Un arbre d'expression ne peut pas contenir une opération dynamique
Erreur source:
Line 8: </div>
Line 9: <div class="editor-field">
Line 10: <%= Html.TextBoxFor(model => model.addressLine1) %>
Line 11: <%: Html.ValidationMessageFor(model => model.addressLine1) %>
Line 12: </div>
Comment puis-je obtenir ce partielle render afin que je puisse utiliser mon addressView partiel sur plusieurs autres types?
Modifié:
// GET: /Person/Create
public ActionResult Create()
{
Person person = new Person();
return View(person);
}
//Person create view
<% Html.RenderPartial("AddressForm"); %>
//AddressForm Partial
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<fieldset>
<legend>Address</legend>
<div class="editor-label">
<label for="addressLine1" class="addressLabel">Address Line 1</label>
</div>
<div class="editor-field">
<%= Html.TextBoxFor(model => model.addressLine1) %>
<%: Html.ValidationMessageFor(model => model.addressLine1) %>
</div>
</fieldset>
Erreur est au-dessus.
La solution
vous ne pouvez pas utiliser les aides fortement typé avec viewmodel de dynamique:
vous pouvez utiliser à la place des aides non fortement typés, comme ceci:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<fieldset>
<legend>Address</legend>
<div class="editor-label">
<label for="addressLine1" class="addressLabel">
Address Line 1</label>
</div>
<div class="editor-field">
<%= Html.TextBox("addressLine1") %>
<%: Html.ValidationMessage("addressLine1") %> </div>
</fieldset>
Autres conseils
Ne pourriez-vous simplement garder tous vos points de vue fortement typés en laissant les deux types de modèle que vous voulez rendre dans votre vue AddressForm implémenter une interface, et laisser la AddressForm utilisation partielle de cette interface comme type de modèle?