2

AspMVC3アプリケーションを使用しています。

私は列挙型を持っています:

public enum EmployeesOptions
    {
        John = 1,
        Peter = 2,
        Andrew = 3
    }

そしてMyViewModelクラス

   public class MyViewModel
    {
        public MyViewModel()
        {
            Employees = new List<EmployeesOptions>()
            {
                EmployeesOptions.John,
                EmployeesOptions.Peter,
                EmployeesOptions.Andrew
            };
        }

        public IEnumerable<EmployeesOptions> Employees { get; set; }
    }

私のコントローラー:

public ActionResult Index()
        {
            var vm = new MyViewModel();
            return View(vm);
        }

マイインデックスビュー:

@model MyViewModel

    <script type="text/javascript">
        var jsonString = '@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(this.Model))';

        var data = ko.mapping.fromJSON(jsonString);
        omega.franchiseInfo = ko.mapping.fromJS(data);
     </script>

サーバーからのシリアル化されたデータは次のようになります。

    Emplyees:[1,2,3]

私はこのようになりたい:

Emplyees:["John","Peter","Andrew"]

私は何が欠けていますか?

アップデート:

var jsonString = '@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(this.Model, Newtonsoft.Json.Formatting.None, new Newtonsoft.Json.Converters.StringEnumConverter()))';

これは仕事をします!

4

3 に答える 3

3

この列挙型を常にJsonConverter文字列値でシリアル化する場合は、次のように属性とStringEnumConverterクラスで装飾できます。

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public enum EmployeesOptions
{
    John = 1,
    Peter = 2,
    Andrew = 3
}

その後、シリアライザー オプションでコンバーター クラスを指定する必要がなくなります。

于 2012-12-03T14:04:19.427 に答える
1

値をList保持するプロパティを装飾しようとしましたが、型を直接装飾する必要があるため、当然のことながら機能しませんでした。Enum[JsonConverter(typeof(StringEnumConverter))]Enum

// Did not work!
[JsonConverter(typeof(StringEnumConverter))]
public List<Assessment.AssessmentFunction> SelectedFunctions { get; set; }

その後、あなたが提案したとおりに実行したところ、期待どおりに機能しました。

var selectedFunctions = @Html.Raw(JsonConvert.SerializeObject(Model.SelectedFunctions,
                                                              new StringEnumConverter()))

Enumint 値の代わりに、 .cshtml ビューEnum内の JavaScript コードで文字列を取得するようになりました。Razor特定の状況で必要なものだけです。

var selectedFunctions = @Html.Raw(Json.Encode(Model.SelectedFunctions))

// Output
var selectedFunctions = [3, 3, 2, 2, 2, 3, 2, 2]

var selectedFunctions = @Html.Raw(JsonConvert.SerializeObject(Model.SelectedFunctions,
                                                              new StringEnumConverter()))

// Output
var selectedFunctions = ["Nurse","Nurse","Doctor","Doctor","Doctor","Nurse","Doctor","Doctor"]
于 2013-07-12T18:29:40.283 に答える
0

列挙型を返します。デフォルトでは、列挙型の値が表示されます。このようにモデルを変更できます。

public class MyViewModel
{
    public MyViewModel()
    {
        Employees = new List<EmployeesOptions>()
        {
            EmployeesOptions.John.ToString(),
            EmployeesOptions.Peter.ToString(),
            EmployeesOptions.Andrew.ToString()
        };
    }

    public IEnumerable<EmployeesOptions> Employees { get; set; }
}

拡張メソッドを使用する.ToString()ことで、列挙型を文字列形式に表現しているものとまったく同じものに変換できます。

于 2012-10-26T04:25:39.200 に答える