Asp.net mvc 将模型发回控制器:一个属性始终为空
我是.NETWeb开发的新手,试图从WinForms转换到MVC5。我在将模型对象的一部分发布回控制器时遇到问题 我最初将模型发送到视图,如下所示:Asp.net mvc 将模型发回控制器:一个属性始终为空,asp.net-mvc,Asp.net Mvc,我是.NETWeb开发的新手,试图从WinForms转换到MVC5。我在将模型对象的一部分发布回控制器时遇到问题 我最初将模型发送到视图,如下所示: [HttpPost] public ActionResult LookupWorkOrder(string workOrderNumber) { var workOrder = getDirector().getWorkOrderInfo(workOrderNumber); if (workOrder == null) {
[HttpPost]
public ActionResult LookupWorkOrder(string workOrderNumber)
{
var workOrder = getDirector().getWorkOrderInfo(workOrderNumber);
if (workOrder == null)
{
Response.StatusDescription = string.Format("Invalid Work Order Number: {0}", workOrderNumber);
return View("Error");
}
var thing = new LotAddModel() { workOrder = workOrder, quantity = 7 };
return View("FoundWorkOrder", thing);
}
以下是您需要了解的两个模型:
public class LotAddModel
{
public WorkOrderInfo workOrder { get; set; }
public int employeeId { get; set; }
public string lotNumber { get; set; }
public int quantity { get; set; }
}
及
点击此控制器方法:
[HttpPost]
public ActionResult AddLotNumber(LotAddModel model)
{
/*
* model.quantity is equal to 7, just like it should be.
* model.workOrder is NULL --> THIS IS THE REASON I AM POSTING THIS QUESTION - why is it always null??
*
*/
try
{
getDirector().addLotNumber(model.workOrder, model.employeeId, model.lotNumber, model.quantity);
return View("FoundWorkOrder", model.workOrder);
}
catch (Exception exception)
{
Response.StatusDescription = exception.Message;
return View("Error"); // I get this bad boy every time...
}
}
除了model.workOrder
属性一直为空外,所有内容都加载到model
object perfect中
我不明白为什么不能将workOrder属性发送回控制器。我真的希望能够做到这一点,或者至少是类似的事情
任何帮助都将不胜感激
model.workOrder
是类型为WorkOrderInfo
和@Html.HiddenFor(x=>x.workOrder)的属性代码>不知道如何序列化它。打开chrome开发工具,检查隐藏字段中的内容。这就是将要发布回控制器的内容,如果无法将其反序列化回WorkOrderInfo
,您将得到null
。为什么不做一些像@Html.HiddenFor(x=>x.workOrder.workOrderNumber)
?
然后改变
public class LotAddModel
{
public string workOrderNumber{ get; set; }
public int employeeId { get; set; }
public string lotNumber { get; set; }
public int quantity { get; set; }
}
编辑:
public class WorkOrderInfo
{
public string workOrderNumber { get; set; }
public string salesOrderNumber { get; set; }
public string itemNumber { get; set; }
public string description { get; set; }
public decimal quantity { get; set; }
public string status { get; set; }
public List<WorkOrderLotNumber> lots { get; set; }
public List<WorkOrderPuller> pullers { get; set; }
public List<WorkOrderBuilder> builders { get; set; }
public List<WorkOrderTester> testers { get; set; }
public List<WorkOrderInspector> inspectors { get; set; }
#region cTor
public WorkOrderInfo()
{
// I don't want to do anything here
}
internal WorkOrderInfo(string workOrderNumber, MainWorkOrderInfo mainInfo, List<WorkOrderLotNumber> lots,
List<WorkOrderPuller> pullers, List<WorkOrderBuilder> builders,
List<WorkOrderTester> testers, List<WorkOrderInspector> inspectors)
{
this.workOrderNumber = workOrderNumber;
this.salesOrderNumber = mainInfo.salesOrderNumber;
this.itemNumber = mainInfo.itemNumber;
this.description = mainInfo.description;
this.quantity = mainInfo.quantity;
this.status = mainInfo.status;
this.lots = lots;
this.pullers = pullers;
this.builders = builders;
this.testers = testers;
this.inspectors = inspectors;
}
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
#endregion
}
public class WorkOrderInfo
{
公共字符串workOrderNumber{get;set;}
公共字符串salesOrderNumber{get;set;}
公共字符串itemNumber{get;set;}
公共字符串说明{get;set;}
公共十进制数量{get;set;}
公共字符串状态{get;set;}
公共列表地段{get;set;}
公共列表拉程序{get;set;}
公共列表生成器{get;set;}
公共列表测试器{get;set;}
公共列表检查器{get;set;}
#区域导体
公共服务
{
//我不想在这里做任何事
}
内部WorkOrderInfo(管柱workOrderNumber、MainWorkOrderInfo mainInfo、列出批次、,
列出拉拔器,列出构建器,
列出测试人员、检查人员名单)
{
this.workOrderNumber=workOrderNumber;
this.salesfordernumber=mainfo.salesfordernumber;
this.itemNumber=mainfo.itemNumber;
this.description=mainfo.description;
this.quantity=mainfo.quantity;
this.status=mainfo.status;
这个.地段=地段;
这个。拉拔器=拉拔器;
这个.builders=builders;
这个。测试员=测试员;
这是检查人员=检查人员;
}
公共重写字符串ToString()
{
返回JsonConvert.SerializeObject(this);
}
#端区
}
我不想只使用ID的主要原因是我需要再次查找它。我们正在运行SQLServer2000,我尽可能地节省时间。有没有办法让它知道如何序列化它?你无论如何都需要查询,记住恶意用户可能会发布他/她想要的任何东西。javascript验证可能会被禁用(记住它们控制自己的浏览器),因此控制器中可能会出现一些无效数据。你必须对照数据库检查这个,以确保一切正常,如果没有返回403或500或任何你认为合适的错误代码。我按照你的建议查看了dev工具中的值,它存储的所有内容都是类的完全限定名?那么,这是否意味着您不能将任何复杂的数据类型发送回控制器类?我明白了,它好像刚刚在对象上调用了ToString()
。这是有道理的。这正是它正在做的。好的,您可以通过重写ToString方法来解决问题,并使用JSON.NET将整个对象序列化为字符串,然后返回该字符串。但稍后您将不得不在控制器中反序列化。我将编辑我的答案以显示代码。但这不是正确的做法。您正在尝试实现一些自定义的旧ASP.NET视图状态(google)
public class LotAddModel
{
public string workOrderNumber{ get; set; }
public int employeeId { get; set; }
public string lotNumber { get; set; }
public int quantity { get; set; }
}
public class WorkOrderInfo
{
public string workOrderNumber { get; set; }
public string salesOrderNumber { get; set; }
public string itemNumber { get; set; }
public string description { get; set; }
public decimal quantity { get; set; }
public string status { get; set; }
public List<WorkOrderLotNumber> lots { get; set; }
public List<WorkOrderPuller> pullers { get; set; }
public List<WorkOrderBuilder> builders { get; set; }
public List<WorkOrderTester> testers { get; set; }
public List<WorkOrderInspector> inspectors { get; set; }
#region cTor
public WorkOrderInfo()
{
// I don't want to do anything here
}
internal WorkOrderInfo(string workOrderNumber, MainWorkOrderInfo mainInfo, List<WorkOrderLotNumber> lots,
List<WorkOrderPuller> pullers, List<WorkOrderBuilder> builders,
List<WorkOrderTester> testers, List<WorkOrderInspector> inspectors)
{
this.workOrderNumber = workOrderNumber;
this.salesOrderNumber = mainInfo.salesOrderNumber;
this.itemNumber = mainInfo.itemNumber;
this.description = mainInfo.description;
this.quantity = mainInfo.quantity;
this.status = mainInfo.status;
this.lots = lots;
this.pullers = pullers;
this.builders = builders;
this.testers = testers;
this.inspectors = inspectors;
}
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
#endregion
}