XML Writer не работает в C# (с веб-приложением. NET MVC) - PullRequest
1 голос
/ 03 мая 2020

Я пытаюсь читать и записывать файл XML в веб-приложении. NET MVC. Считыватель XML (GetScoresXMLReader ()) работает - он может выводить на веб-страницу. Но средство записи XML (AddScoresXMLWriter) не работает для страницы формы. Может кто-нибудь сказать мне, что я делаю не так, пожалуйста? Ниже приведен класс User, который определяет методы XML и класс контроллера (для представления AddACustomer), из которого я вызываю методы XML.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.Web;
using System.Data;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using Microsoft.AspNetCore.Http;
using System.Diagnostics;

namespace WebApplication10.Models
{
    [Serializable]
    [XmlRoot("User"), XmlType("User")]
    public class Users
    {

        // Get the current directory.
        static string path = Directory.GetCurrentDirectory();
        static String binPath = path + "\\binary\\data.bin";
        static String xmlPath = path + "\\Properties\\Users.xml";


        [Required(ErrorMessage = "Must specifiy a first name")]
        [Display(Name = "First Name")]
        [DataType(DataType.Text)]
        public string FirstName { get; set; }

        [Required(ErrorMessage = "Must specifiy a last name")]
        [DataType(DataType.Text)]
        [Display(Name = "Last Name")]
        public string LastName { get; set; }

        [Required(ErrorMessage ="Must specifiy a role")]
        [Display(Name = "Role")]
        [DataType(DataType.Text)]
        public string Role { get; set; }


        //Parameter Less constructor needed for XML Serialization Only!!!
        public Users() { }


        //CONSTRUCTOR 
        public Users( String fname, String lname, String date)
        {
            FirstName = fname;
            LastName = lname;
            Role = date;
        }

        public String DisplayUser()
        {
            return ("First Name: " + FirstName + ", Last Name:" + LastName + ", Role: " + Role + "/n");
        }


        public class XMLReader
        {


            public static List<Users> AddScoresXMLWriter(Users userSet)
                {
                    List<Users> userList = GetScoresXMLReader();

                    userList.Add(userSet);
                    var writer = new System.Xml.Serialization.XmlSerializer(typeof(List<Users>));
                    var xmlFile = new System.IO.StreamWriter(xmlPath);
                    writer.Serialize(xmlFile, userList);
                    xmlFile.Close();

                return userList;
                }

            public static List<Users> GetScoresXMLReader()
            {
                List<Users> eventList = new List<Users>();
                try
                {
                    System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(List<Users>));
                    System.IO.StreamReader file = new System.IO.StreamReader(xmlPath);
                    eventList = (List<Users>)reader.Deserialize(file);
                    file.Close();
                }
                catch (FileNotFoundException fex)
                {
                    Debug.Write(fex.Message);
                }
                catch (Exception ex)
                {
                    Debug.Write(ex.Message);
                }
                return eventList;
            }


            //FOR LIST ALL CUSTOMERS PAGE

            public List<Users> OutPutListOfAllUsers()
            {  
                DataSet ds = new DataSet();//Using dataset to read xml file  
                ds.ReadXml(xmlPath);
                var results = new List<Users>();
                results = (from rows in ds.Tables[0].AsEnumerable()
                            select new Users
                            {
                                FirstName = rows[0].ToString(), //Convert row to int  
                                LastName = rows[1].ToString(),
                                Role = rows[2].ToString(),
                            }).ToList();
                return results;
            }
        }


    }
}

А вот контроллер, с которого вызывается писатель XML.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using System.Web;
using Microsoft.Extensions.Logging;
using WebApplication10.Models;
using static WebApplication10.Models.Users;

namespace WebApplication10.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult ViewAllUsers()
        {
            XMLReader readXML = new XMLReader();
            var data = readXML.OutPutListOfAllUsers();
            return View(data.ToList());
        }

        public IActionResult AboutMe()
        {
            return View();
        }
        public IActionResult Privacy()
        {
            return View();
        }
        [HttpGet]
        public ActionResult AddACustomer()
        {
            return View();
        }

        [HttpPost]
        public ActionResult AddACustomer(Users user)
        {
            // do validation 
            if (!ModelState.IsValid)
            {
                //ADD FORM INPUT TO XML FILE
                XMLReader.AddScoresXMLWriter(user);
                return View(user);
            }
            // save user

            //redirect

            return Redirect("/");
        }


        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

Если я загружаю страницу ViewAllCustomers, я вижу записи, которые я добавил вручную в XML, но когда я заполняю все необходимые поля формы (на странице AddACustomer), она отправляет, но XML не изменяется Если я пытаюсь отправить форму не полностью, я получаю сообщение об ошибке, что XML файл используется.

When loading page from menu or when redirected from AddACustomer page after form submission - no errors but XML is not appended with form submission

Если кнопка отправки формы нажата, но форма не заполнена, то генерируется ошибка, что XML используется и не может быть записано.

enter image description here

...