Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 将模型发回控制器:一个属性始终为空_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 将模型发回控制器:一个属性始终为空

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) {

我是.NETWeb开发的新手,试图从WinForms转换到MVC5。我在将模型对象的一部分发布回控制器时遇到问题

我最初将模型发送到视图,如下所示:

[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
}