Заполнение свойства данных VueJS через строго связанный список DOM в представлении razor

#c# #asp.net #asp.net-mvc #vuejs2 #asp.net-core-mvc

#c# #asp.net #asp.net-mvc #vuejs2 #asp.net-core-mvc

Вопрос:

Я работаю над Asp.Net Основное веб-приложение MVC и использование VueJS для рендеринга / манипулирования во внешнем интерфейсе. В конечном счете, я хочу реализовать Master-Detail в режиме просмотра Razor с использованием VueJS, где строки сведений (позиции) могли бы добавляться / удаляться динамически, но пока я просто пытаюсь получить доступ к объектной модели домена List<T> типа в VueJS Data и пытаюсь динамически добавлять / удалять строки данных.

Вот мой код:

ViewModel

 public class VueJsTestModelDetail
{
    public int DetailId { get; set; }
    public int Id { get; set; }
    [EmailAddress]
    public string Email { get; set; }
}
  

Контроллер

 public IActionResult Vue()
{
    VueJsTestModel viewModel = new VueJsTestModel();
    viewModel.Id = 1;
    viewModel.Name = "Saud Nasir";
    viewModel.Designation = "Software Engineer";

    for (int i = 0; i < 5; i  )
    {
        viewModel.VueJsTestModelDetails.Add(new VueJsTestModelDetail { Id = 1, DetailId = i   1, Email = "xyz_"   (i   1).ToString()   "@abc.com" });
    }
    return View(viewModel.VueJsTestModelDetails);
}
  

Режим просмотра Razor

 @model List<Vue.js_Hello_World.Models.VueJsTestModelDetail> 

<div id="app">
    <div class="container border" style="border: thin;">
        <div class="mt-2">
            <form asp-action="Vue">
                <div class="form-group" style="text-align:right; width:100%">
                    <input type="submit" value="Save" class="btn btn-primary btn-sm" />
                    <input v-on:click="View" type="button" value="View" class="btn btn-success btn-sm" />
                </div>
                <ul>
                    <li v-for="(detail, index) in DetailData">
                        <h4>{{detail.DetailID}}</h4>
                    </li>
                </ul>
            </form>
        </div>
    </div>
</div>
  

Скрипт VueJS

 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<script>
var vm = new Vue({
    el: "#app",
    data: {
        DetailData: '@Model',
     },
    methods: {
        View: function () {
            alert(this.DetailData);
        }
    }
});
</script>
  

Я хочу заполнить его DetailData значениями, которые я отправляю с контроллера, но в этом коде DetailData заполняются строки, содержащие имя типа данных. (например, « List<Vue.js_Hello_World.Models.VueJSTestModelDetails> «). Я хочу сохранять фактические значения в DetailData при загрузке страницы, например:

 DetailData[0].DetailID = 1, 
DetailData[0].Id = 0, 
DetailData[0].Email = "xyz_1@abc.com"
  

Ответ №1:

Происходит то, что вывод @Model эквивалентен вызову toString() для модели. Вместо этого то, что вы хотите сделать, это вывести сериализованную версию объекта в формате json.

Замените строку

 DetailData: '@Model',
  

с помощью строки

 DetailData: @Json.Serialize(Model),
  

Комментарии:

1. Я не могу выразить вам достаточной благодарности!! значительно упростило мою текущую задачу.