【问题标题】:MVC4 query string to an Action一个动作的 MVC4 查询字符串
【发布时间】:2013-09-23 14:43:52
【问题描述】:

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

[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 解决方案构建一个查询字符串,该解决方案调用控制器中的第二个操作(public virtual ActionResult TaskCreateWithModel(string schemaType, Task model)),但我不知道如何发送任务模型在查询字符串中?我试图调用这个查询字符串:http://localhost:82/Task/TaskCreate?schemaType=default&amp;Description=someDesciption,但总是调用第一个操作。如何使用任务模型构建查询字符串?

【问题讨论】:

  • 你是什么意思:“但总是第一个动作是调用”?
  • 您不能将object(在本例中为Task)作为参数传递给HttpGet 操作。此外,您的查询字符串显示TaskCreate,如果您想调用第二种方法,那么它应该是TaskCreateWithModel
  • localhost:82/Task/… - 查询字符串总是调用第一个(public virtual ActionResult TaskCreate(string schemaType)) 动作
  • 更改为 POST 将允许您在请求正文中传递对象,并且无论如何都是“创建”操作的正确/标准/正确/最佳方法
  • 使用具有相同控制器动作名称的 [HttpPost] 以使该动作在带有查询字符串的表单提交时成为可能

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


【解决方案1】:

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

此外,使用 GET 进行创建操作可能会使您容易遭受跨站请求伪造 (CSRF),因为 ASP.Net MVC 防伪造保护仅适用于 POST。

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

如果您使用 HTTP POST 方法,那么 ASP.Net MVC 的自动模型绑定将从请求正文中创建正确的类型化对象,因此您将能够进行类似的操作

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

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

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

【讨论】:

    【解决方案2】:

    您可以尝试这样的事情(为了便于阅读,使用回车符)。 我猜数字和日期的格式将取决于您的语言环境:

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

    【讨论】:

      【解决方案3】:

      名字很清楚:QueryString。您传递的所有内容都被解释为字符串(您可以在服务器端取消装箱)。 复杂类型不能通过 QueryString 传递,除非你序列化它。

      在你的情况下,特别是你需要打电话:

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

      调用第二个动作。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-19
          • 1970-01-01
          • 2015-08-05
          • 2014-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-25
          相关资源
          最近更新 更多