C# MVC控制器是具有相同等效传入参数的模型,无效
我不知道该怎么问这个问题,但不知何故我不得不 TL;我曾在一个系统上工作,由其他人传递给我,在某个地方运行,他们带着他们的有线请求和想法来到这里。所以我说让我们做X的事情,让它完成,但当我只是运行它,我看到它没有工作,因为它曾经。。。调试应用程序后,我到达目的地,测试并观察,就像我的头撞了一整天,我唯一能说的是,为什么一切都是正确的,为什么数据存在,为什么数据有效,控制器仍然说它无效:| 嗯。今天我又回到了同一个项目,同一个问题,我看到的是: 这是我发送的请求:C# MVC控制器是具有相同等效传入参数的模型,无效,c#,angularjs,asp.net-mvc,asp.net-web-api,validate-request,C#,Angularjs,Asp.net Mvc,Asp.net Web Api,Validate Request,我不知道该怎么问这个问题,但不知何故我不得不 TL;我曾在一个系统上工作,由其他人传递给我,在某个地方运行,他们带着他们的有线请求和想法来到这里。所以我说让我们做X的事情,让它完成,但当我只是运行它,我看到它没有工作,因为它曾经。。。调试应用程序后,我到达目的地,测试并观察,就像我的头撞了一整天,我唯一能说的是,为什么一切都是正确的,为什么数据存在,为什么数据有效,控制器仍然说它无效:| 嗯。今天我又回到了同一个项目,同一个问题,我看到的是: 这是我发送的请求: { "Code" : 1
{
"Code" : 16,
"StampForm" : {
"$error" : {},
"$name" : "stampForm",
"$dirty" : true,
"$pristine" : false,
"$valid" : true,
"$invalid" : false,
"$submitted" : true,
"confirmUser" : {
"$viewValue" : "a",
"$modelValue" : "a",
"$validators" : {},
"$asyncValidators" : {},
"$parsers" : [],
"$formatters" : [null],
"$viewChangeListeners" : [],
"$untouched" : false,
"$touched" : true,
"$pristine" : false,
"$dirty" : true,
"$valid" : true,
"$invalid" : false,
"$error" : {},
"$name" : "confirmUser",
"$options" : null
},
"ReqNo" : "2",
"ConfirmUser" : "a",
"SabtDate" : "1395/06/15"
},
"MouseData" : {
"locLeft" : 250.5,
"locTop" : 395.53125,
"width" : 812,
"height" : 663,
"mouseX" : 223.5,
"mouseY" : 186.46875
}
}
我使用的模型是:
public class StampForm
{
public string ReqNo { get; set; }
public string SabtDate { get; set; }
public string FlightRef { get; set; }
public string HotelRef { get; set; }
public string ConfirmUser { get; set; }
public string PassengerNum { get; set; }
public string Price { get; set; }
public string FlightNo1 { get; set; }
public string FlightNo2 { get; set; }
public string TicketSrv { get; set; }
public string VoucherSrv { get; set; }
/// <summary>
/// تنظیم کننده
/// </summary>
public string Corrector { get; set; }
/// <summary>
/// اقامت
/// </summary>
public string Stay { get; set; }
public string PersonPrc { get; set; }
public string RoomPrc { get; set; }
public CartableStampPositions Position { get; set; }
public string Description { get; set; }
}
public class MouseData
{
public float LocLeft { get; set; }
public float LocTop { get; set; }
public float LocRight { get; set; }
public float LocBottom { get; set; }
public float Width { get; set; }
public float Height { get; set; }
public float MouseX { get; set; }
public float MouseY { get; set; }
}
public class StampVM
{
public int Code { get; set; }
public StampForm StampForm { get; set; }
public MouseData MouseData { get; set; }
}
公共类StampForm
{
公共字符串要求{get;set;}
公共字符串SabtDate{get;set;}
公共字符串FlightRef{get;set;}
公共字符串HotelRef{get;set;}
公共字符串ConfirmUser{get;set;}
公共字符串PassengerNum{get;set;}
公共字符串Price{get;set;}
公共字符串FlightNo1{get;set;}
公共字符串FlightNo2{get;set;}
公共字符串TicketSrv{get;set;}
公共字符串VoucherSrv{get;set;}
///
/// تنظیم کننده
///
公共字符串校正器{get;set;}
///
/// اقامت
///
公共字符串Stay{get;set;}
公共字符串PersonPrc{get;set;}
公共字符串RoomPrc{get;set;}
公共CartableStampositions位置{get;set;}
公共字符串说明{get;set;}
}
公共级MouseData
{
公共浮点LocLeft{get;set;}
公共浮点LocTop{get;set;}
公共浮点LocRight{get;set;}
公共浮点数{get;set;}
公共浮点宽度{get;set;}
公共浮动高度{get;set;}
公共浮点MouseX{get;set;}
公共浮点鼠标{get;set;}
}
公共类StampVM
{
公共整数代码{get;set;}
公共StampForm StampForm{get;set;}
公共MouseData MouseData{get;set;}
}
在这里,当我调试时:
你看到了吗?
“ConfirmUser”用“a”填充,它会产生错误,但除此之外,它不是“ConfirmUser”,而是“ConfirmUser”,它以小“c”开头,来自其他角度对象,具有相同的名称,它甚至不存在于我的模型中,但由于它具有相同的名称,控制器让它进入,并让它参与。给我带来很多麻烦和头痛。现在我抓到了它,我必须解决它,但是我应该如何告诉控制器忽略它呢?
更新,我忘了告诉您我使用的是MVC.Net WebAPI 2控制器,而不是MVC控制器您可以向该方法添加以下属性
[Bind(Exclude = "ConfirmUser")]
所以它看起来像这样
public ActionResult MyMethod([Bind(Exclude = "ConfirmUser")] MyModel model)
有一种解决方法-在viewmodel中添加JObject属性
confirmUser',以便(不需要的)确认用户对象绑定到该对象,而不是模型绑定器尝试将该
对象绑定到
字符串`:
public class StampForm
{
public string ReqNo { get; set; }
public string SabtDate { get; set; }
public string FlightRef { get; set; }
public string HotelRef { get; set; }
public string ConfirmUser { get; set; }
[JsonProperty("confirmUser")]
public JObject User { get; set; }
..........
}
结果将是:
我忘了提到我的控制器是MVC中的web api 2控制器,
.(…,[Bind(Exclude=“confirmUser”)]StampVM stamp)
或.(…[Bind(Exclude(Exclude=“StampForm.confirmUser”)]StampVM stamp)
对我有效:(您有权对发送的请求进行更改吗?模型绑定器正在尝试绑定json对象confirmUser
(因为模型绑定区分大小写)使用string ConfirmUser
,最终导致错误,模型绑定器需要一个字符串,而请求包含一个对象。我建议从客户端发送一个只包含所需值的干净请求。@开发人员是否有可能创建自定义绑定器?我尝试过一次,但该属性在整个mo中运行一次del,不是每个字段,我试图找到活页夹本身,但我根本没有找到它…,仅此答案是最好的,但如果我能做到这一点,因为唯一可以使用web api的选项似乎只有FromUri
,它没有任何Include/Exclude属性。@deadManN-在使用自定义活页夹之前,您是否有ol超过发送的请求?复制粘贴注释;错误地放在下面的答案下-您是否有权对发送的请求进行更改?模型绑定器正在尝试绑定json对象confirmUser
(因为模型绑定区分大小写)使用您的字符串确认用户
,从而导致错误,model binder需要字符串,而请求包含对象。我建议从客户端发送一个只包含所需值的干净请求。该请求是错误的,两个不同对象具有相同的属性名称没有意义。我建议继续对发送该请求的团队进行操作,并要求他们进行更改。一个糟糕的修复方法是将您的模型字符串ConfirmUser
更改为一个对象,该对象的结构在请求中出现,并从$modelValue
读取值,但需要注意的是,如果currentUser'和currentUser`输入的顺序发生变化,则会导致此错误terchanges in the request。@开发人员可能对MVC很满意,但在现实世界中不是这样,因为一个以大写字母“C”开头,另一个以小写字母“C”开头,这就是区别,这在java和C#中都是有效的,但是由于客户机标准和C#标准之间存在差异,服务器应该同时支持这两种标准,但它首先应该检查,如果发现match,不应该检查其他可能性,因为它有,那么我必须排除它们。是的,有点同意。但是这里的请求负载是垃圾;如果我没有错的话,这是完整的角度形式及其内部属性。在这种情况下,可能是这个特定操作的自定义模型绑定器,这就是我想知道如何编写的方法。。。这些活页夹是怎么一起工作的