将TextAreaFor传递给控制器​​时未设置对象引用

时间:2016-08-30 14:42:05

标签: asp.net-mvc asp.net-mvc-4

该应用程序旨在允许用户输入本地计算机的IP地址,然后它将返回该计算机的HDD信息。它以 TextAreaFor 框中已有的默认值开始,并对该值执行查询。这部分没问题。但是当用户尝试输入他们自己的值并点击“刷新”按钮时,它会不断出现错误对象引用未设置为对象的实例。

我不确定为什么会这样。在我看来,单击该按钮会提交一个POST操作,该操作应启动控制器中的第二个方法。然后将当前模型传递给控制器​​,并附加 TextAreaFor 中的值,并对新值运行mainCode()方法。

编辑:根据What is a NullReferenceException, and how do I fix it?我很确定我从控制器返回一个空模型。我只是不知道如何。表单字段应该发送控制器 TextAreaFor 中包含的所有内容,因此模型不应为空。

Edit2:我做了一些测试,模型返回正常,但TextAreaFor的值不是。当mainCode()尝试对startDrives.startingDrives做一些逻辑时,它不能,因为该变量由于某种原因是空的。

型号:

namespace RelengAdmin.Models
{
    public class DriveInfo
    {
        public class DriveHolder
        {
            public string startingDrives {get; set;}
        }

        public DriveHolder startDrives = new DriveHolder();

        public void mainCode()
        {
            /****Code to return the HDD size omitted****/
        }
    }
}

查看:

@using (Html.BeginForm())
{
    <input type="submit" value="Refresh" />

    @Html.TextAreaFor(model => model.startDrives.startingDrives, new {@class = "HDDTextBox"})
}

控制器:

namespace RelengAdmin.Controllers
{
    public class HDDCheckerController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            DriveInfo myDrive = new DriveInfo();
            myDrive.startDrives.startingDrives = "148.136.148.53"

            myDrive.mainCode();
            return View(myDrive);
        }

        [HttpPost]
        public ActionResult Index(DriveInfo model)
        {
            model.mainCode();
            return View(model);
        }
    }
}

2 个答案:

答案 0 :(得分:4)

问题是您的模型的startDrives属性实际上并未声明为具有getter和setter的属性,因此模型绑定器不会绑定到它。我能够在本地复制该问题,并通过将startDrives声明为属性并在构造函数中初始化来解决它。

public class DriveInfo
{

   public class DriveHolder
   {
      public string startingDrives { get; set; }
   }


   public DriveHolder startDrives { get; set; }

   public DriveInfo()
   {
      startDrives = new DriveHolder();
   }

   public void mainCode()
   {
      /****Code to return the HDD size omitted****/
   }    
}

答案 1 :(得分:1)

您的问题有点不清楚模型实际上在哪里为空..但我会假设当您点击按钮时,它会转到正确的操作,但model中没有任何内容因为您没有&# 39; t传递了任何特定的值..

所以试试这个:

<强> CSHTML

@using (Html.BeginForm())
{
    <input type="submit" value="Refresh" />

    @Html.TextArea("startingDrive", "148.136.148.53", new {@class = "HDDTextBox"})
}

<强>控制器

[HttpPost]
public ActionResult Index(string startingDrive)
{
    DriveInfo searchThisDrive = new DriveInfo();

    searchThisDrive.startDrives.startingDrives = startingDrive;
    searchThisDrive.mainCode();

    return View(searchThisDrive);
}

请告诉我这是否有帮助!