J'utilise un contrôle utilisateur dans un projet Web Forms. C'est un projet hérité, mais ASP.NET MVC nous a beaucoup inspiré et l'a inclus dans notre projet.Comment accéder à l'objet à partir du modèle Inherits dans le contrôle utilisateur dans le code de balisage ASPX
J'inclus un contrôle utilisateur, mais au lieu de l'ancien "usercontrol-can-do-everything", nous les utilisons plus comme des partiels et leur donnons un viewmodel.
Cependant, un problème est survenu lors de l'accès à mes valeurs à partir de mon "viewmodel" dans le code. Laissez-moi montrer du code et j'expliquerai le problème.
La définition de contrôle:
<%@ Control Language="vb" AutoEventWireup="false" Inherits="Saxo.Websites.Shop.Web.PartialControl`1[[Saxo.Websites.Shop.Models.Recommendations.RecommendationsViewModel]]" %>
Mon "modèle de vue":
public class RecommendationsViewModel
{
public Dictionary<string, Placement> Placements { get; set; }
public RecommendationsViewModel()
{
this.Placements = new Dictionary<string, Placement>();
}
}
public class Placement
{
public Placement(string divid, string title):this(divid,title,6)
{
}
public Placement(string divid, string title, int count)
{
this.DivId = divid;
this.Title = title;
this.Count = count;
}
public string DivId { get; set; }
public string Title { get; set; }
public int Count { get; set; }
}
Mon fichier partialcontrol:
public class PartialControl<T> : UserControl
{
public T Model { get; set; }
public static string RenderPartial(string path, object model)
{
var control = new UserControl();
try
{
control = (UserControl)control.LoadControl(path);
}
catch (Exception ex)
{
throw new ApplicationException("Error loading partial control: " + path, ex);
}
var prop = control.GetType().GetProperty("Model");
if (prop == null)
{
throw new ApplicationException(control.GetType().FullName + " does not implement Property 'Model'");
}
try
{
prop.SetValue(control, model, null);
}
catch (Exception)
{
throw new ApplicationException("Error setting model on : " + control.GetType().FullName);
}
using (var sw = new StringWriter())
{
using (var hw = new HtmlTextWriter(sw))
{
try
{
control.RenderControl(hw);
return sw.ToString();
}
catch (Exception ex)
{
throw new ApplicationException("Error Rendering Partial Control: " + control.GetType().FullName, ex);
}
}
}
}
}
Maintenant, je veux faire ce qui suit dans mon balisage:
<script charset="utf-8" type="text/javascript">
var test = '<%= Model.Placements["key_in_my_dictionary"].Title %>';
</script>
J'ai aussi essayé des variantes comme <%
et <%#
.
Cependant, je reçois cette erreur:
System.Web.HttpCompileException: D:\Git\Saxo\Saxo.Websites.Base\src\Saxo.Website.Base\Views\Recommendations\_PageRecommendations.ascx(38): error BC30203: Identifier expected.
Mais je peux faire ce qui suit avec succès:
<script charset="utf-8" type="text/javascript">
var test = '<%= Model.Placements.Count %>';
</script>
Par conséquent, ma question est: comment puis-je écrire mon code si ma variable JS test obtient la valeur des titres?
qui fonctionnerait, seul problème est la façon dont il est mis en œuvre, est il n'y a pas de code beh ind dans le contrôle de l'utilisateur. Il s'est avéré que l'erreur était causée par mon frontend était VB.NET et non C# (wtf?: D). Mais je vais marquer votre réponse comme la réponse, car c'est la meilleure façon de le faire pour les références futures lorsque les gens le trouveront via Google. –