2016-01-30 2 views
2

объект с дополнительными свойствами из json-like notation string должен быть создан. метод будет вызван из точки зрения Razor пройти colmodel к jqgrid как объект JSON, каксоздавать объекты из свойств в строке

@Html.Raw(Json.Encode(Model.GetColModel())) 

метод должен иметь подпись, как

object GetColModel(string colName, int colWidth, string additonalProperties) 

Например,

GetColModel("customer", 17, "address=\"Toronto\", index=1555") 

должен возвращать объект

new { colName="customer", colwidth=17, address="Toronto", index=1555 } 

Могут быть вложенные свойства, например, в JSON, экв.

GetColModel("customer", 17, "formatoptions= new { formatter=\"number\", editable=true } ") 

должен возвращать объект

new { colName="customer", colwidth=17, formatoptions=new { 
        formatter="number", 
        editable=true 
        } 
} 

Я попробовал метод

public object GetColModel(string colName, int colWidth, string additonalProperties) 
    { 
     return new 
     { 
      name = colName, 
      width = colWidth, 
      &addtitionalProperties 
     }; 
    } 

, но это не удается, поскольку макросы не поддерживаются в C#

Как создать такой метод, или другой способ добавить свойства из базы данных в json strung в режиме Razor?

Он вызывается из режима просмотра ASP.NET/Mono C# MVC 4. Используются виды бритвы и RazorEngine.

ответ

0

Для этого ничего не создано, но вы разбираете строку с помощью строки (string.Split позволит вам разделить на «,», но если у вас могут быть те, что в вашем тексте, вам придется построить настоящий парсер, или переключите строковый формат на нечто вроде CSV, где вы можете найти множество парсеров. Вы можете найти парсер свойств для простого синтаксиса. Или вы нажимаете свою дополнительную строку свойств как json и используете Json.net для разбора.

После ваша строка анализируется в структуру ключ/значение, то вы можете использовать ExpandoObject, чтобы заполнить ваш конечный объект и вернуть это.
https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject(v=vs.110).aspx

+0

я могу передать дополнительные свойства, как JSON строки и создать объект .NET из него с помощью Json.NET анализатор. Как добавить эти свойства к возвращенному объекту? Есть ли пример использования объекта expando для этого? – Andrus

+0

Нет конкретных примеров, но точка Expando заключается в том, что вы можете добавлять свойства динамически. – Cleverguy25

0

Вот наивная реализация настоящего решения на основе json.
Вы можете вызвать его с помощью:

dynamic d = Model.GetColModel("customer", 17, " { formatoptions : { formatter : \"number\", editable :true }, stam :2}"); 

Реализация:

static class ModelExtension 
{ 
    public static dynamic GetColModel(this Model model, string colName, int colWidth, string additonalProperties) { 
     dynamic expando = new ExpandoObject(); 
     var json = JsonConvert.DeserializeObject<JObject>(additonalProperties); 

     expando.name = colName; 
     expando.width = colWidth; 

     return new FromPropertiesDynamicObjectCreator(expando, json); 
    } 

    private class FromPropertiesDynamicObjectCreator : DynamicObject 
    { 
     private readonly dynamic expando = null; 

     public FromPropertiesDynamicObjectCreator(IDictionary<string, object> expando, JObject props = null) { 
      this.expando = expando; 

      if (props != null) { 
       ((dynamic)this).props = props; 
      } 
     } 

     public override bool TrySetMember(SetMemberBinder binder, object value) { 
      if (binder.Name.Equals("props")) { 
       var jsonObj = value as JObject; 
       JToken current = jsonObj.First; 
       var dictionary = expando as IDictionary<string, object>; 

       RecurseJson(current, dictionary); 
       return true; 
      } 

      return false; 
     } 

     private void RecurseJson(JToken current, IDictionary<string, object> dictionary) { 
      JToken value; 
      Dictionary<string, object> newDictionary; 

      while (current != null) { 
       var children = current.Children().ToList(); 

       foreach (var child in children) { 
        switch (child.Type) { 

         case JTokenType.Object: 
         case JTokenType.Array: 
          newDictionary = new Dictionary<string, object>(); 
          dictionary[child.Path] = newDictionary; 
          RecurseJson(child, newDictionary); 
          break; 

         case JTokenType.Property: 
          var prop = ((JProperty)child); 
          value = prop.Value; 

          if (value.HasValues) { 
           newDictionary = new Dictionary<string, object>(); 
           dictionary[prop.Name] = newDictionary; 
           RecurseJson(child, newDictionary); 
           break; 
          } 
          dictionary[prop.Name] = ((dynamic)value).Value; 
          break; 

         default: 
          var val = ((dynamic)child).Value; 

          if (val is JToken) { 
           dictionary[child.Path] = val.Value; 
          } 
          else { 
           dictionary[child.Path] = val; 
          } 

          break; 
        } 
       } 

       current = current.Next; 
      } 
     } 

     public override bool TryGetMember(GetMemberBinder binder, out object result) { 
      object value; 
      var dictionary = expando as IDictionary<string, object>; 

      if (dictionary.TryGetValue(binder.Name, out value)) { 
       var innerDictionary = value as IDictionary<string, object>; 

       if (innerDictionary != null) { 
        result = new FromPropertiesDynamicObjectCreator(innerDictionary); 
       } 
       else { 
        result = value; 
       } 
       return true; 
      } 

      result = null; 
      return true; 
     } 
    } 
} 
Смежные вопросы