ASP.Net MVC 模型使用 GET 绑定复杂对象

Posted

技术标签:

【中文标题】ASP.Net MVC 模型使用 GET 绑定复杂对象【英文标题】:ASP.Net MVC Model Binding Complex Object using GET 【发布时间】:2014-01-25 16:47:42 【问题描述】:

我的网络项目中有一个类:

public class MyClass

    public int? Param1  get; set; 
    public int? Param2  get; set; 

这是我的控制器方法中的一个参数:

public ActionResult TheControllerMethod(MyClass myParam)

    //etc.

如果我使用 POST 调用该方法,模型绑定会自动工作(我在 js 端使用 angular,这可能无关紧要):

$http(
    method: "post",
    url: controllerRoot + "TheControllerMethod",
    data:    
        myParam: myParam
    
).success(function (data) 
    callback(data);
).error(function () 
    alert("Error getting my stuff.");
);

如果我使用 GET,则该参数在控制器中始终为 null。

$http(
    method: "get",
    url: controllerRoot + "TheControllerMethod",
    params:    
        myParam: myParam
    
).success(function (data) 
    callback(data);
).error(function () 
    alert("Error getting my stuff.");
);

使用默认模型绑定器的复杂模型绑定是否仅适用于 POST,或者我可以做些什么来使用 GET?

【问题讨论】:

我相信简单的答案是肯定的,你只能发布一个复杂的类型。您可以使用复杂类型执行获取请求,但需要将其序列化到查询字符串 soemhow 参见***.com/questions/47931625/…中的示例 【参考方案1】:

答案是肯定的。 GET 和 POST 请求之间的区别在于 POST 主体可以具有内容类型,因此它们可以在服务器端正确解释为 XML 或 Json 等;对于 GET,您所拥有的只是一个查询字符串。

【讨论】:

【参考方案2】:

为什么在 POST 中调用属性“data”,在 GET 中调用“params”?两者都应该称为“数据”。

$http(
    method: "get",
    url: controllerRoot + "TheControllerMethod",
    data:    
        myParam: myParam
    
).success(function (data) 
    callback(data);
).error(function () 
    alert("Error getting my stuff.");
);

【讨论】:

【参考方案3】:

使用 ASP.NET MVC,您确实可以在 GET 请求上绑定您的模型,只要您的查询字符串参数名称与模型类的属性名称相同。来自 answer 的示例:

public class ViewModel

  public string Name  set;get;
  public string Loc set;get;

您可以像这样执行 Get 请求

MyAction?Name=jon&Loc=America

MVC 会自动绑定你的模型:

[HttpGet]
public ViewResult MyAction(ViewModel model)

    // Do stuff
    return View("ViewName", model);

【讨论】:

以上是关于ASP.Net MVC 模型使用 GET 绑定复杂对象的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 4 模型验证

[转] ASP.NET MVC 模型绑定的功能和问题

Asp.Net MVC 4 模型绑定和剔除绑定以选择元素

ASP.NET MVC学习之模型绑定

asp.net mvc 4,模型绑定改变了线程?

Asp.Net MVC在过滤器中使用模型绑定