javascript - 返回视图 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 方法)。我真的迷路了。
解决方案
一般来说,你不应该像那样传递对象——充其量你应该只传递 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 函数只接受在函数中声明和设置的两个局部变量。如果没有看到您的提交页面,我无法真正评论为什么设置一个值会阻止调用工作。
推荐阅读
- reactjs - 如何用 HoC 包装包含钩子的函数
- blazor - 如何在 Blazor 中检测整页刷新/重新加载
- c# - string.Format - SS:MS 12:34 中的 timeSinceLevelLoad
- javascript - 使用 Jest 测试 NUXT.js 和 Vue.js 应用程序。获取“在 mapState() 中找不到 [vuex] 模块命名空间”和“[vuex] 未知操作类型”
- python - 为什么我的混淆矩阵被切断了?
- ios - Swift 和 SwiftUI 从 TextField 字符串绑定到模型的已发布的可选 Integer 属性
- node.js - 使用 Express Websocket Ping 改进节点?
- css - 有没有办法完成 h4 + p 但用 css 或 scss 更改 h4
- python - 如何将 for 循环打印语句的结果转换为 pandas 数据帧?
- java - 如何在后台运行自定义平台特定代码?