【问题标题】:asp mvc http get action with object as parameterasp mvc http get 以对象为参数的操作
【发布时间】:2013-07-09 20:54:48
【问题描述】:

在我的控制器中我得到了动作:

[HttpGet]
public ActionResult CreateAdmin(object routeValues = null)
{
    //some code
    return View();
}

还有http帖子:

[HttpPost]
 public ActionResult CreateAdmin(
    string email, 
    string nameF, 
    string nameL, 
    string nameM)
 {
        if (email == "" || nameF == "" || nameL == "" || nameM == "")
        {
            return RedirectToAction("CreateAdmin", new
            {
                error = true,
                email = email,
                nameF = nameF,
                nameL = nameL,
                nameM = nameM,
            });
  }

http get Action 中的变量 routeValues 始终为空。如何正确地将对象作为参数传递给[http get] Action

【问题讨论】:

  • 要获取的参数可以从 URL 以查询字符串的形式传递。您对 GET 的 routeValues 有什么期望?
  • 正在编写一个包含该参数的小类而不是一个选项?类似于类 CreateAdminModel{string email;string nameF;...}
  • CreateAdmin?error=True&email=admin1234%40mail.ru&nameL=asf&nameM=adf 我希望 Asp MVC 从 url 收集参数到 routeValues 对象
  • 我不认为这就是 asp.net MVC 所做的。您可以使用 Request.Querystring 集合访问查询字符串参数。
  • 您可能会因为 RedirectToAction 的 routeValues 参数而感到困惑。但它不是那样工作的。由于您传递的是匿名对象,因此您甚至无法在 HttpGet 操作中访问 routeValues 的属性。您可以做的一件事是在 HttpGet 操作方法中指定参数,例如 [HttpGet] public ActionResult CreateAdmin(bool? error, string email, string nameF, string nameL, string nameM),然后查询字符串值将映射到此变量。

标签: asp.net asp.net-mvc


【解决方案1】:

您不能将对象传递给 GET,而是尝试像这样传递单个值:

[HttpGet]
public ActionResult CreateAdmin(int value1, string value2, string value3)
{
    //some code
    var obj = new MyObject {property1 = value1; propety2 = value2; property3 = value3};
    return View();
}

然后,您可以从应用的任何位置传递值,例如:

http://someurl.com/CreateAdmin?valu1=1&value2="hello"&value3="world"

【讨论】:

【解决方案2】:

如前所述,您不能将整个对象传递给 HTTPGET 操作。但是,当我不想拥有具有数百个参数的 Action 时,我喜欢做的是:

  • 创建一个将封装所有必需参数的类
  • 将字符串值传递给我的 HTTPGET 操作
  • 将字符串参数转换为我的 GET 操作正在使用的实际对象。

因此,假设您有一个代表所有输入字段的类:

    public class AdminContract
    {
      public string email {get;set;}
      public string nameF {get;set;}
      public string nameL {get;set;}
      public string nameM {get;set;}
    }

然后您可以添加一个只需要一个字符串参数的 GET 操作:

[HttpGet]
public ActionResult GetAdmin(string jsonData)
{
  //Convert your string parameter into your complext object
  var model = JsonConvert.DeserializeObject<AdminContract>(jsonData);

    //And now do whatever you want with the object
    var mail = model.email;
    var fullname = model.nameL + " " + model.nameF;

    // .. etc. etc. 

    return Json(fullname, JsonRequestBehavior.AllowGet);
}

还有多田!只需通过字符串化和对象(在前端)然后转换它(在后端),您仍然可以享受 HTTPGET 请求的好处,同时在请求中传递整个对象,而不是使用数十个参数。

【讨论】:

  • 很好的答案,除了你省略了客户端(JavaScript)如何编码数据并将其发送到操作方法。所以你只提供了一半的答案。
【解决方案3】:

您可以将值传递给 Http Get 方法,例如

Html.Action("ActionName","ControllerName",new {para1=value, para2 = value});

你可以在控制器中定义你的动作

[HtttpGet]
public ActionResult ActionName(Para1Type para1, Para2Type para2)
{
}

【讨论】:

  • 您可以通过拥有模型并传递模型对象来传递对象中的全部值。
猜你喜欢
  • 2016-02-14
  • 2019-06-09
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多