【问题标题】:Problem returning view MVC/Javascript/.NET Core返回视图 MVC/Javascript/.NET Core 时出现问题
【发布时间】:2019-10-04 18:34:48
【问题描述】:

我对 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 方法。 这是 ChatController 中的 Chat 方法:

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

如果我不输入任何对话名称,它会一直用到这个方法,但它不会起作用(因为该字段是强制性的,我需要它来加载视图)。有任何想法吗?我尝试过使用 ajax,但是虽然它会传递对话名称,但它会卡在 RedirectToAction 语句中(永远不会点击 ChatController 中的 Chat 方法)。我真的迷路了。

【问题讨论】:

  • 您是否尝试过通过 TempData 而不是作为参数将模型传递给 Chat 操作结果?或者也许不是在CreateConversation 中调用return RedirectToAction("Chat","Chat", model);,而是直接调用Chat 操作结果...return Chat(model);。看到这个post

标签: javascript c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

通常,您不应该像这样传递对象 - 最好只传递 ViewModel 以防止有人伪造数据并可能破坏您的应用程序。

您使用重定向的方式实际上会将整个模型推送到 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 而不是 value 将获得给定元素的开始和结束标记之间的全部内容,我假设该元素是 textarea 类型而不是普通文本输入。您可能会在 <textarea>...</textarea> 之间获得额外的元素

在我的示例中,我的 javascript 函数只接受在函数中声明和设置的两个局部变量。如果没有看到您的提交页面,我无法真正评论为什么设置一个值会阻止调用工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多