2

我正在更新多条记录,单击提交按钮后出现错误,这表明控制器收到 NULL 并在第 36 行报告以下错误 下面是我的控制器、视图和模型的代码。

你调用的对象是空的。描述:

当前 Web 请求执行期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

    Source Error: 

    Line 34:         public ActionResult UpdateAll(ICollection<Test0> test0s)
    Line 35:         {
    Line 36:             foreach (var tst in test0s)
    Line 37:             {
    Line 38:                 if (ModelState.IsValid)

    Source File: c:\users\rsc_vok\documents\visual studio 2010\Projects\MvcTest0\MvcTest0\Controllers\Test0Controller.cs    Line: 36

这是模型:

namespace MvcTest0.Models
{
    public class Test0
    {
        public int id { get; set; }
        public int SectnID { get; set; }
        public string Section { get; set; }
        public string Comment { get; set; }
    }

    public class Test0DBContext : DbContext
    {
        public DbSet<Test0> Test0s { get; set; }
    }
}

这是我的控制器代码:

    public ActionResult UpdateAll(int id=0)
    {
        int sectnid = id;
        List<Test0> records = db.Test0s.ToList();
        var Sectnrecord = from r in records
                        where r.SectnID == sectnid
                        select r;

        return View(Sectnrecord.ToList());
    }

    [HttpPost]
    public ActionResult UpdateAll(ICollection<Test0> test0s)
    {
        foreach (var tst in test0s)
        {
            if (ModelState.IsValid)
            {
                db.Entry(tst).State = EntityState.Modified;
            }
        }
        db.SaveChanges();

        return View(test0s);
    }

这是我的看法

      @model IEnumerable<MvcTest0.Models.Test0>

      @{
      ViewBag.Title = "UpdateAll";
     }

    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

   @using (Html.BeginForm())
   {
       @Html.ValidationSummary(true)

       var sectnHeader = new String[10];
       sectnHeader[0] = "A. QUALITY";
       sectnHeader[1] = "B. VR REFERRAL";
       var items = Model.ToArray();
       var sections = 1;
       for (var sectnLoop = 0; sectnLoop < sections; sectnLoop++)
       {
            <table>
                <tr>
                    <td>
                        <b>@(sectnHeader[sectnLoop])</b>
                    </td>
                </tr>  
            </table>
            <table>
                <tr>
                    <th>SectnID</th>
                    <th>Section</th>
                    <th>Comment</th>
                </tr>

            </table>
           for (var i = sectnLoop * 2; i < sectnLoop * 2 + 2; i++)
           {
               var sctnid = "sectnname" + i;
               @Html.HiddenFor(m => items[i].id)
               @Html.HiddenFor(m => items[i].SectnID)

               <table>
                  <tr>
                    <td>
                        @Html.DisplayFor(m => items[i].SectnID)
                    </td>
                    <td>
                        @Html.EditorFor(m => items[i].Section)
                        @Html.ValidationMessageFor(m => items[i].Section)
                    </td>
                    <td>
                        @Html.EditorFor(m => items[i].Comment)
                        @Html.ValidationMessageFor(m => items[i].Comment)
                    </td>
                 </tr>
                </table> 
           } 
       } 
        <p>
            <input type="submit" value="Save" />
        </p>
   }
4

1 回答 1

2

解决方案:

  1. 您必须将视图模型更改为支持.Add()方法的集合类型:

    @model List<MvcTest0.Models.Test0>

  2. 更改所有@Html.___For()助手,例如:

    @Html.HiddenFor(m => m[i].id)
    @Html.HiddenFor(m => m[i].SectnID)
    @Html.DisplayFor(m => m[i].SectnID)
    @Html.EditorFor(m => m[i].Section)
    @Html.ValidationMessageFor(m => m[i].Section)
    @Html.EditorFor(m => m[i].Comment)
    @Html.ValidationMessageFor(m => m[i].Comment)
    

请注意,模型必须在回发中重新创建,并且 IEnumerable 没有向自身添加项目的方法,这与通用列表不同。

于 2012-06-30T20:59:14.323 回答