Проблема возврата представления MVC / Javascript / .NET Core - PullRequest
1 голос
/ 04 октября 2019

Я довольно новичок в MVC, и у меня, похоже, возникла проблема с возвратом представления из JS. Я работаю над сайтом чата, и этот код создает новый чат с именем, которое вы ему назначаете. Вот мой код JS:

    function CreateConversation() {
    var conversationName = document.getElementById("conversationName").value;
    var username = document.getElementById("usernameLabel").textContent;

    window.location.href = "/CreateNewChat/CreateConversation?username=" + username + "&convName=" + conversationName;
}

Это должно вызвать этот метод ActionResult:

public IActionResult CreateConversation(string username, string convName)
    {

        ChatModel model = new ChatModel(username, convName);
        model.Chatters.Add(username);
        return RedirectToAction("Chat","Chat", model);
    }

, который делает, пока я не набираю имя разговора в текстовом поле. Если я проверю код JS, значения имени пользователя и имени разговора будут правильно установлены, но метод ActionResult не будет вызван, если я введу имя разговора. Вот метод Chat в контроллере ChatController:

public IActionResult Chat(ChatModel model)
    {
        return View(model);
    }

Если я не введу имя разговора, он будет полностью использован для этого метода, но он не будет работать (так как это поле обязательно для заполнения)и мне нужно, чтобы загрузить вид). Есть идеи? Я пытался использовать ajax, но пока он передает имя разговора, он застревает в операторе RedirectToAction (никогда не попадет в метод Chat в ChatController). Я действительно потерян здесь.

1 Ответ

0 голосов
/ 06 октября 2019

Как правило, вы не должны передавать объекты таким образом - в лучшем случае вы должны только передавать ViewModels, чтобы не допустить того, чтобы кто-то подделал данные и потенциально испортил ваше приложение.

То, как вы это делаете с помощью перенаправления, будетфактически вставьте всю модель в параметры URL-адреса, прежде чем переходить обратно в код, оставляя его широко открытым для того, чтобы кто-то мог изменить его по своему усмотрению.

В идеале вы должны опубликовать, чтобы создать постоянный экземпляр, а затем перенаправить, передав только идентификаторк методу Chat(), например, так:

CreateNewChatController.cs

    public ActionResult CreateConversation(string username, string convname)
    {
        Guid chatId = yourServiceFactory.CreateNewChat(username, convname);
        // You passed the service the username anyway so it can do the Chatters.Add() internally

        return RedirectToAction("Chat", "Chat", new { id = chatId });
    }

ChatController.cs

    public ActionResult Chat(Guid id)
    {
        ChatModel model = yourServiceFactory.GetChatById(id);
        return View(model);
    }

Однако, если вы действительно хотите передать модель на ActionResult Chat(ChatModel model), затем вы можете выполнить и вернуть действие контроллера напрямую.

    public IActionResult CreateConversation(string username, string convname)
    {
        ChatModel model = new ChatModel(username, convname);
        model.Chatters.Add(username);

        ChatController chatController = new ChatController();
        return chatController.Chat(model);
    }

Я создал очень упрощенный рабочий пример этого на основе того, что вы сказали выше,поэтому любая проверка, которую вы можете иметь в конструкторе ChatModel, опущена в моем примере.

Для любых других ошибок я бы предложил проверитьчтобы убедиться, что передаваемые вами значения не определяются приложением как «потенциально опасные» и отбрасываются.

Принимая во внимание, что использование .textContent вместо значения приведет к полному содержаниюмежду начальным и конечным тегами данного элемента, я предполагаю, что элемент является типом textarea, а не обычным вводом текста. Вы можете получать дополнительные элементы между <textarea>...</textarea>

В моем примере моя функция javascript просто принимает две локальные переменные, объявленные и установленные внутри функции. Не видя вашу страницу отправки, я не могу прокомментировать, почему установка значения препятствует выполнению вызова.

...