2014-09-06 9 views
0

Я использую пользовательский элемент управления в проекте Web Forms. Это унаследованный проект, но мы вдохновили ASP.NET MVC и включили его в наш проект.Как получить доступ к объекту из модели Inherits в пользовательском управлении в код разметки ASPX

Я внедряю пользовательский элемент управления, но вместо старого «usercontrol-can-do-everything» мы более используем их как частичные и даем им viewmodel.

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

Определение управления:

<%@ Control Language="vb" AutoEventWireup="false" Inherits="Saxo.Websites.Shop.Web.PartialControl`1[[Saxo.Websites.Shop.Models.Recommendations.RecommendationsViewModel]]" %> 

Мой "вид модели":

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

Мой 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); 

        } 
       } 
      }    
     } 
    } 

Теперь, я хочу сделать следующее в моей разметке:

<script charset="utf-8" type="text/javascript"> 
var test = '<%= Model.Placements["key_in_my_dictionary"].Title %>'; 
</script> 

Я также пробовал варианты, как <% и <%#.

Однако, я получаю эту ошибку:

System.Web.HttpCompileException: D:\Git\Saxo\Saxo.Websites.Base\src\Saxo.Website.Base\Views\Recommendations\_PageRecommendations.ascx(38): error BC30203: Identifier expected. 

Но я могу сделать следующее с успехом:

<script charset="utf-8" type="text/javascript"> 
    var test = '<%= Model.Placements.Count %>'; 
    </script> 

Поэтому мой вопрос: как я пишу код так мой переменной JS Тест получает значение названия?

ответ

2

Вероятно, это можно обойти, добавлены некоторые геттер (так, что он не получает тех «[» и «]») следующим образом:

public class RecommendationsViewModel 
{ 
    // ... 
    public Placement GetPlacement(string name) { return Placements[name]; } 
    // ... 
} 

, а затем в ASCX:

<script charset="utf-8" type="text/javascript"> 
    var test = '<%= Model.GetPlacement("name") %>'; 
</script> 

Или, вероятно, следующее поможет в ASCX:

<script runat=server> 
    Response.Write("<script charset=\"utf-8\" type=\"text/javascript\">"); 
    Response.Write("var test = " + Model.Placements["key_in_my_dictionary"].Title); 
    Response.Write("<\/script>"); 
</script> 
+0

это будет работать, только вопрос, как она будет реализована, это нет кода позади в пользовательский контроль. Оказалось, что ошибка была вызвана моим интерфейсом VB.NET, а не C# (wtf?: D). Но я отвечу на ваш ответ как ответ, так как это лучший способ сделать это для будущих ссылок, когда люди находят его через Google. –