ASP.NET MVC: можно ли заставить Json () использовать неявный строковый оператор объекта? - PullRequest
0 голосов
/ 01 мая 2011

У меня есть пользовательский тип, который имеет неявный оператор строки следующим образом (упрощенно):

public class TransactionType
{
    private string StringValue;

    public static implicit operator string(TransactionType arg)
    {
        return arg.StringValue;
    }

    public override string ToString() // This doesn't work, even when
    {                                 // returning an arbitrary constant string
        return arg.StringValue;       // such as "Testing"
    }
}

Я пытаюсь вернуть JsonResult следующим образом:

[HttpPost]
public JsonResult Foo()
{
   var transactionType = new TransactionType();
   return Json(transactionType); 
}

JSONполученная строка - "TransactionType":{} вместо значения StringValue

Есть ли простой способ, чтобы Json () использовал оператор неявной строки?

Спасибо!

Редактировать: Как указано ниже, переопределение ToString() также не работает.Я все еще просто получаю пустой объект "TransactionType": {} вместо строкового представления объекта.

Ответы [ 3 ]

3 голосов
/ 01 мая 2011

ToString - это метод, который вызывается практически везде, чтобы получить строковые представления.

Вы должны переопределить ToString в своем классе вместо использования неявного строкового оператора.

1 голос
/ 01 мая 2011

Переопределить ToString вместо определения вашего собственного строкового оператора.Или сделать оба.Пусть один вызов другой.

0 голосов
/ 01 мая 2011

Обычно вы хотите, чтобы это сериализовалось в объект со свойством и значением, хотя я полагаю, вы могли бы просто вернуть строку. Если вы возвращаете строку, вам не нужен JSON, вы можете использовать html или текст - любой из них будет работать (return Content( transactionType.ToString() );). Если вы действительно хотите JSON, тогда я бы предложил просто настроить объект со свойством .

public class TransactionType
{
    public string Value { get; set; }
} 

Тогда вы можете сделать именно так, как вы пытаетесь:

[HttpPost]
public JsonResult Foo()
{
   var transactionType = new TransactionType { Value = "foo" };
   return Json(transactionType); 
}

Это будет сериализовано в { "Value" : "foo" }

Обратите внимание, что в MVC3 JsonResult все еще использует JavaScriptSerializer. Если свойство должно быть приватным, вы можете использовать DataContractJsonSerializer, пометить свойство как DataMember (даже если приватное), сериализовать результат, а затем вернуть эту строку, используя ContentResult, но с MIME-типом «application / json».

public class TransactionType
{
    public TransactionType( string type )
    {
        Value = type;
    }

    [DataMember]
    private string Value { get; set; }
    ...
} 

Затем вы можете (после изменения типа возвращаемого значения) создать метод для сериализации. и вернуть результат содержимого, аналогичный методу Json ().

[HttpPost]
public ActionResult Foo()
{
   var transactionType = new TransactionType( "foo" );
   return DataContractJson(transactionType); 
}

private ActionResult DataContractJson<T>( T obj ) where T : class
{
     using (var stream = new MemoryStream())
     {
         var serializer = new DataContractJsonSerializer(typeof(T));
         serializer.WriteObject( stream, obj );
         var content = Encoding.UTF8.GetString( stream.ToArray() );
         return Content( content, "application/json" );
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...