MVC4查询字符串到一个Action

时间:2013-09-23 14:43:53

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

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

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

4 个答案:

答案 0 :(得分:2)

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

在您的情况下,尤其需要致电:

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

拨打第二个动作。

答案 1 :(得分:2)

您可以尝试这样的事情(回车符以便于阅读)。 我想数字和日期的格式取决于你的语言环境:

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

答案 2 :(得分:2)

使用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

答案 3 :(得分:1)

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