Имитация AJAX с чистым ASP. NET MVC - PullRequest
1 голос
/ 03 февраля 2020

У меня есть предстоящая задача для университета. Целью является разработка API, содержащего системный лог c, который могут использовать веб и android агенты, запрашивая через URL-адреса.

Что мне нужно?
Как указано в заголовке вопроса, мне нужно обновить содержимое представления без необходимости использовать AJAX / JQuery ", что не является обязательным предварительным условием в задаче, но я должен, как крайний срок за углом, следовательно, нет времени, чтобы изучить эти "

Что я пытался?
Я думал об использовании C# Threading объект, то есть «System.Threading.Timer», чтобы вызывать API каждые x секунд для обнаружения изменений и записи в представление.
Все шло хорошо, пока я не попытался записать изменения в представление. Я всегда сталкиваюсь с System.Argument Exception: значение не попадает в ожидаемый диапазон . После некоторого просмотра это исключение вызывается при попытке записи в представление после того, как оно уже загружено. Вот код

User.cs

public class User
{
    public int? Id { get; set; }
    public String Name { get; set; }
}

_Card.cs html

@model String
<!--dummy card design-->
<span>@Model</span><br>  

Index.cs html

@model List<User>
@using Newtonsoft.Json;
//Consider @Model = new List<User>(){new User(1,"User1"),new User(2,"User2")}
@foreach (User user in Model) { @Html.Partial("~/Views/z.Shared/Components/Cards/_Card.cshtml", user.Id + "         " + user.Name); }

<div id="newUsers">
    @{
        int existingUsersCount = Model.Count();
        void callable()
        {
            WebClient wc = new WebClient();
            String url = "apiURL";
            byte[] response = wc.DownloadData(url);
            String encodedResponse = System.Text.Encoding.ASCII.GetString(response);
            //Consider encodedResponse = [{"Id":3,"Name":"newUser1"},{"Id":4,"Name":"newUser2"}]
            List<User> users = JsonConvert.DeserializeObject<List<User>>(encodedResponse);
            int newRecordsCount = users.Count() - existingUsersCount;
            if (newRecordsCount > 0)
            {
                List<User> newUsers = users.Skip(existingUsersCount).ToList();
                foreach (User user in newUsers)
                {
                    //Problem is here i cant write the changes to the view 
                    Html.RenderPartial("~/Views/z.Shared/Components/Cards/_Card.cshtml", user.Id + "         " + user.Name);               
                    //Exception thrown: 'System.ArgumentException' in System.Web.dll
                    //An unhandled exception of type 'System.ArgumentException' occurred in System.Web.dll
                    //Value does not fall within the expected range.
                }
                existingUsersCount+=newRecordsCount;
            }
        }
    }
</div>
@{
    var timer = new System.Threading.Timer((e) => callable(), null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
}

Замечания по коду

  • Откуда поток берет свои ресурсы с сервера машина или браузер машина?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...