MVC4 查询字符串到操作

本文关键字:操作 字符串 查询 MVC4 | 更新日期: 2023-09-27 18:32:38

我在构建查询字符串时遇到了一些问题。我有一个模型:

[HttpGet]
 public partial class Task
    {
        public System.Guid UniqueID { get; set; }
        public string Description { get; set; }
        public decimal Priority { get; set; }
        public long TaskTypeId { get; set; }
        public TaskStatus TaskStatus { get; set; }
        public string GroupWorkspaceUrl { get; set; }
        public Nullable<System.DateTime> StartDate { get; set; }
        public Nullable<System.DateTime> Deadline { get; set; }
        public Nullable<int> PlannedHours { get; set; }
       {...}
    }

我在控制器中有 2 个动作:

[HttpGet]
public virtual ActionResult TaskCreate(string schemaType)
        {
            var model = new Task();
            model.Accept(_taskService.ReaderVisitor, schemaType)
             {...}
        }
[HttpGet]
public virtual ActionResult TaskCreateWithModel(string schemaType, Task model)
        {
            SetDefaultValues(model);
            model.Accept(_taskService.ReaderVisitor, schemaType);
            {...}
       }

我想从其他 C# WinForms 解决方案构建一个查询字符串,该解决方案调用控制器中的第二个操作(公共虚拟操作结果任务创建与模型(字符串架构类型,任务模型((,但我不知道如何在查询字符串中发送任务模型?我尝试调用此查询字符串:http://localhost:82/Task/TaskCreate?schemaType=default&Description=someDesciption但始终调用第一个操作。如何使用任务模型构建查询字符串?

MVC4 查询字符串到操作

使用 HTTP GET 操作创建新的任务资源是非常不寻常的。GET应该是幂等的(即,如果您多次发出相同的请求,则效果与您发出一次相同 - 没有副作用(

此外,将 GET 用于创建操作可能会使您面临跨站点请求伪造 (CSRF( 的风险,因为 ASP.Net MVC 防伪保护仅适用于 POST。

创建操作通常是一个 HTTP POST(或者可能是 PUT(,其中任务对象的数据包含在请求正文中,而不是查询字符串中。此外,使用查询字符串会限制您可以拥有的数据量(URL 限制为 2000 个字符?

如果使用 HTTP POST 方法,则 MVC ASP.Net 自动模型绑定将从请求正文创建正确的类型化对象,以便能够执行类似

[HttpPost]
public virtual ActionResult TaskCreateWithModel(string schemaType, Task model)

如你所愿,但使用 POST 而不是 GET 并且不使用查询字符串。这里有一个关于 MVC 中模型绑定的很好的描述

http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx

您可以尝试这样的事情(为了便于阅读,回车(。我想数字和日期的格式将取决于您的区域设置:

http://localhost:82/Task/TaskCreateWithModel?schemaType=default
                   &model.priority=3.2
                   &model.Description=hello
                   &model.GroupWorkspaceUrl=thisistheGroupWorkspaceUrl

名称显然是:QueryString。您传递的所有内容都被解释为字符串(您可以在服务器端拆箱(。复杂类型不能由 QueryString 传递,除非对其进行序列化。

特别是在您的情况下,您需要致电:

http://localhost:82/Task/TaskCreateWithModel?schemaType=default&Description=someDesciption

调用第二个操作。

不能将复杂对象作为 GET 请求的一部分传递。您要么必须向控制器/操作发送 post 请求,要么像 jbl 建议的那样将单个属性作为 GET 请求的一部分发送。就个人而言,如果可能的话,请进行 POST 请求,因为查询字符串数据将在浏览器 URL 栏中可见。您可以对其进行加密,但浏览器有 URL 长度限制。