Можно ли заставить .NET преобразовать пользовательский объект в одно значение в JsonResult? - PullRequest
0 голосов
/ 17 августа 2011

Я написал класс с именем EncryptedValue. Я определил операторы и ToString, чтобы позволить его использовать в коде как обычное значение (int, double, DateTime). То, что я хочу сделать, это присвоить значение этому объекту и включить его в мой JSON, отправленный обратно на мою страницу.

Вот мой класс:

public class EncryptedValue<T> {
  public T Value { get; }
  public string Encryted { get; }
  /* Implementation Details */
}

Вот мое действие:

public JsonResult MyAction() {
 EncryptedValue value = 5;
 return Json(new { EncryptedValue: value });
}

Вот JSON, который я хочу создать:

{ "EncryptedValue":"TheEncryptedString" }

Но вместо этого получается:

{ "EncryptedValue":{"Encrypted":"TheEncryptedString","Value":2}}

Даже если я не добавлю никаких свойств в класс, JSON будет выглядеть так:

{ "EncryptedValue":{} }

Кто-нибудь знает, как заставить JavaScriptSerializer думать, что класс - это одно значение, и вызывать ToString () для него?

UPDATE

Полагаю, мне нужно уточнить, что это упрощенный пример. У меня есть сложные типы, которые будут использовать этот класс:

public class User {
  public EncryptedValue UserId { get; set }
  public string UserName { get; set }
}

И я буду выписывать список пользователей:

IList<User> users = GetUsers();
return Json(users);

Ответы [ 3 ]

0 голосов
/ 17 августа 2011

Самый простой способ, который я могу придумать для вас, - это использовать собственный метод на вашем контроллере:

 protected ActionResult Encrypted<T>(T inputElement)
 {
     Encrypted<T> instance = new Encrypted<T> { Value = inputElement };

     return Json(new { Encrypted = instance.Encrypted });
 }

Тогда вы просто вызываете это с вашего контроллера:

public ActionResult Sample()
{
     return Encrypted(10);
}
0 голосов
/ 17 августа 2011

Работает ли это:

return Json(new { EncryptedValue: value.Encrypted} );
0 голосов
/ 17 августа 2011

Вы можете использовать linq для создания анонимного типа (или просто создать его без linq), который содержит только те данные, которые вы хотите.

Редактировать:

Разве это не делает то, что вы после?

        IList<User> userList = GetUsers();

        var users = from user in userList
                    select new
                            {
                                EncryptedValue = user.UserId.Encryted
                            };

        return Json(users);
...