首页 > 解决方案 > 返回视图 MVC/Javascript/.NET Core 时出现问题

问题描述

我对 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 方法)。我真的迷路了。

标签: javascriptc#asp.netasp.net-mvcasp.net-mvc-4

解决方案


一般来说,你不应该像那样传递对象——充其量你应该只传递 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 });
    }

聊天控制器.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在我的示例中省略了您在构造函数中可能进行的任何验证。

对于任何其他错误,我建议检查您传入的值是否未被应用检测为“潜在有害”并被丢弃。

请注意,使用 of.textContent而不是 value 将获得给定元素的开始标签和结束标签之间的全部内容,我假设该元素是 textarea 类型而不是普通文本输入。你可能会得到额外的元素<textarea>...</textarea>

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


推荐阅读