【问题标题】:MVC NullReferenceException on @foreach (var item in Model)@foreach 上的 MVC NullReferenceException(模型中的变量项)
【发布时间】:2014-11-02 18:37:48
【问题描述】:

读完后出现以下错误

What is a NullReferenceException, and how do I fix it?

我了解错误是什么,但不知道它是如何引起的或在我的情况下如何解决它,

谁能解释为什么?

错误:

System.NullReferenceException:对象引用未设置为对象的实例。

在线错误:

@foreach(模型中的变量项)

控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using TMTMonitorandCompare.Models;


namespace TMTMonitorandCompare.Controllers
{

public class HomeController : Controller

{
 private MetaClone_2Entities db = new MetaClone_2Entities();
 public ActionResult Index(string filtername)        
    {

        var filterresults = from m in db.UserInfoes
                            select m;            

        filterresults = filterresults.Where(x => x.UserCode.ToString().Contains(filtername)).OrderBy(x => x.UserCode);

        return View(filterresults);
    }
    public ActionResult Login()
    {
        return View("Login");
    }
    public ActionResult CheckUser()
    {
        //check username & password
        if ((Request.Form["username"] == "user") && (Request.Form["password"] == "pass"))
        {
            // use forms auth class to set the cookie
            FormsAuthentication.SetAuthCookie(Request.Form["username"], true);
            // redirect to view
            return View("Index");
        }
        else
        {
            return View("Login");
        }
    }

    public ActionResult SessionTimeout()
    {
        return View();
    }
    public ActionResult ForgotPassword()
    {
        return View();
    }
  }
}

查看:

@model IEnumerable<TMTMonitorandCompare.Models.UserInfo>
@{
ViewBag.Title = "Home Page";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<script>
$(document).ready(function () {
    @*Validation for Text fields with name formpart*@
    $('#SendRequest').click(function (e) {
        var isValid = true;
        $("input[type='text'][name='formpart']").each(function () {
            if ($.trim($(this).val()) == '') {
                isValid = false;
                $(this).css({
                    "border": "1px solid red",
                    "background": "#FFCECE"
                });
            }
            else {
                $(this).css({
                    "border": "",
                    "background": ""
                });
            }
        });
        if (isValid == false)
            e.preventDefault();
        else
            alert('Thank you for submitting');
    });


    $("#resultsgo").click(function () {
        $("#basicModal2").modal('hide');
    });
    $("#bckpage").click(function () {
        $("#basicModal3").modal('hide');
        $("#basicModal2").modal('show');
    });
    $("#bcktostart").click(function () {
        $("#basicModal3").modal('hide');
    });

    $("#SendRequest").click(function () {
        var imei = ("IMEI: " + $("#imei").val());
        $('#printImei').html(imei);
        var phonenumber = ("Phone Number: " + $("#phoneNumber").val());
        $('#printPhoneNumber').html(phonenumber);
        var policynumber = ("Policy Number: " + $("#policyNumber").val());
        $('#printPolicyNumber').html(policynumber);
    });

    @*Code for passing code (Should work)*@
    $("#SendCodeRequest").click(function () {
        var thecode = ("Code: " + $("#theCode").val());
        $('#printCode').html(thecode);
    });


    @*Code for dropdowns ( not working)*@
    $('#pickButton').dropdown();
    $('#selectionDropdown li').on('click', function () {
        $('#dropdown_title').html($(this).find('a').html());
    });

});
</script>


<button type="button" class="btn btn-success pull-right" id="logonbutton" onclick="location.href = '@Url.Action("Logon", "Home")'">Logon</button>
<table class="table">
<thead>
    <tr>
        <th>New Request</th>
        <th>Existing Request</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td>
            <form class="form-horizontal">
                <div class="form-group">
                    <label class="control-label col-xs-2" for="imei">IMEI:</label>
                    <div class="col-xs-9">
                        <input type="text" class="form-control" id="imei" name="formpart" placeholder="IMEI">
                    </div>
                </div>

                <div class="form-group">
                    <label class="control-label col-xs-2" for="phoneNumber">Phone Number:</label>
                    <div class="col-xs-9">
                        <input type="tel" class="form-control" id="phoneNumber" placeholder="Phone Number">
                    </div>
                </div>

                <div class="form-group">
                    <label for="platform" class="control-label col-xs-2">Policy Organisation:</label>
                    <div class="col-xs-10">
                        <div class="dropdown">
                            <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown">
                                Select
                                <span class="caret"></span>
                            </button>
                            <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu2">
                                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">TMT Internals</a></li>
                            </ul>
                        </div>
                    </div>
                </div>

                <div class="form-group">
                    <label for="policyNumber" class="control-label col-xs-2">Policy Number:</label>
                    <div class="col-xs-10">
                        <input type="text" class="form-control" id="policyNumber" name="formpart" placeholder="Policy Number">
                    </div>
                </div>

                <div class="form-group">
                    <label for="platform" class="control-label col-xs-2">Platform:</label>
                    <div class="col-xs-10">
                        <div class="dropdown">
                            <button class="btn btn-default" id="pickButton" data-toggle="dropdown">
                                <span id="dropdown_title">Select</span>
                                <span class="caret"></span>
                            </button>
                            <ul class="dropdown-menu" id="selectionDropdown">
                                <li><a tabindex="-1" href="#">Android</a></li>
                                <li><a tabindex="-1" href="#">IOS</a></li>
                                <li><a tabindex="-1" href="#">Windows Phone</a></li>
                            </ul>
                        </div>
                    </div>
                </div>

                <div class="form-group">
                    <label for="diagnosticMode" class="control-label col-xs-2">Diagnostic Mode:</label>
                    <div class="col-xs-10">
                        <div class="dropdown">
                            <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown">
                                Select
                                <span class="caret"></span>
                            </button>
                            <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu3">
                                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Simple</a></li>
                                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Advanced</a></li>
                                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Mannual</a></li>
                                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Complete</a></li>
                            </ul>
                        </div>
                    </div>
                </div>

                <div class="form-group">
                    <div class="col-xs-offset-2 col-xs-10">
                        <a id="SendRequest" href="#" class="btn btn-success"
                           data-toggle="modal"
                           data-target="#basicModal">Create New Request</a>
                        <button type="submit" class="btn btn-primary">Back to List</button>
                    </div>
                </div>
            </form>
        </td>

        <td>
            <div class="form-group">
                <div class="col-xs-offset-2 col-xs-10">
                    <div class="span7 text-center">
                        <input type="text" class="form-control" id="theCode" placeholder="Please Enter Code">
                        <input type="submit" value="Go!" class="btn btn-success" id="sendcoderequest" data-toggle="modal"
                               data-target="#basicModal2" />
                    </div>
                </div>
            </div>

            @using (Html.BeginForm("Index", "Home", FormMethod.Get))
            {
                <p>
                    <label for="platform" class="control-label">Enter Code:</label><br />
                    @Html.TextBox("filtername")
                    <input type="submit" value="Filter" />
                </p>
            }

            <div class="modal fade" id="basicModal" tabindex="-1" role="dialog" aria-labelledby="basicModal" aria-hidden="true">
                <div class="modal-dialog">
                    <div class="modal-content">

                        <div class="modal-header">
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
                            <h4 class="modal-title" id="myModalLabel">Summary</h4>
                        </div>

                        <div class="modal-body">
                            <span id="printImei"></span><br />
                            <span id="printPhoneNumber"></span><br />
                            <span id="printPolicyNumber"></span>

                        </div>

                        <div class="modal-footer">
                            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                            <button type="button" class="btn btn-primary">Save changes</button>
                        </div>

                    </div>
                </div>
            </div>


            <div class="modal fade" id="basicModal2" tabindex="-1" role="dialog" aria-labelledby="basicModal" aria-hidden="true">
                <div class="modal-dialog">
                    <div class="modal-content">
                        <div class="modal-header">
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
                            <h4 class="modal-title" id="myModalLabel">Summary</h4>
                        </div>
                        <div class="modal-body">
                            <h2>Results</h2>

                            <span id="printCode"></span><br />

                            <div class="pull-right"><button type="submit" class="btn btn-success" id="toggle">Toggle</button> </div>

                            <table class="table">
                                <thead>
                                    <tr>
                                        <th></th>
                                        <th>Date</th>
                                        <th>Test Type</th>
                                    </tr>
                                </thead>
                                <tbody>


                                    @foreach (var item in Model)
                                    {

                                        <tr>
                                            <td>
                                                <input type="checkbox">
                                            </td>
                                            <td>
                                                @Html.DisplayFor(modelItem => item.CreationDateTime)
                                            </td>
                                            <td>
                                                @Html.DisplayFor(modelItem => item.AppModeId)
                                            </td>
                                        </tr>
                                    }

                                </tbody>
                            </table>
                            <div class="form-group">
                                <div class="col-xs-offset-2 col-xs-10">
                                    <a href="#" class="btn btn-success"
                                       data-toggle="modal"
                                       data-target="#basicModal3" id="resultsgo">Go!</a>
                                </div>
                            </div>
                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-success">Save changes</button>
                            <button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>

                        </div>
                    </div>
                </div>
            </div>


            <div class="modal fade modal-lg" id="basicModal3" tabindex="-1" role="dialog" aria-labelledby="basicModal3" aria-hidden="true">
                <div class="modal-dialog modal-lg">
                    <div class="modal-content">

                        <div class="modal-header">
                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
                            <h4 class="modal-title" id="myModalLabel">Summary</h4>
                        </div>

                        <div class="modal-body">
                            <h2 id="tableheading">Comparison</h2>
                            <div class="btn-toolbar">
                                <div class="btn-group pull-left">
                                    <button type="button" class="btn btn-success" id="bcktostart">Back to Start</button>
                                    <button type="button" class="btn btn-success" id="bckpage">Back a Page</button>
                                </div>
                                <div class="btn-group pull-right">
                                    <button type="button" class="btn btn-success" id="singlebutton">Single</button>
                                    <button type="button" class="btn btn-success" id="multibutton">Multi</button>
                                </div>
                            </div>
                            <script>
                                $(document).ready(function () {
                                    $("#Table1").hide()
                                    $("#Table2").hide()
                                });
                                $("#multibutton").click(function () {
                                    $("#Table2").hide()
                                    $("#Table1").show()
                                    $("#tableheading").text('Multi-Comparision');
                                });
                                $("#singlebutton").click(function () {
                                    $("#Table1").hide()
                                    $("#Table2").show()
                                    $("#tableheading").text('Single-Comparision');
                                });
                            </script>

                            <table class="table table-striped" id="Table1">
                                <thead>
                                    <tr>
                                        <th>Phone 1</th>
                                        <th>Phone 2</th>
                                        <th>Phone 3</th>
                                    </tr>
                                </thead>
                                <tbody>
                                    <tr>
                                        <td>***Result***</td>
                                        <td>***Result***</td>
                                        <td>***Result***</td>
                                    </tr>
                                </tbody>
                            </table>
                            <table class="table table-striped" id="Table2">
                                <thead>
                                    <tr>
                                        <th>Phone 1</th>
                                    </tr>
                                </thead>
                                <tbody>
                                    <tr>
                                        <td>***Result***</td>
                                    </tr>
                                </tbody>
                            </table>
                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-success">Save changes</button>
                            <button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
                        </div>
                    </div>
                </div>
            </div>
        </td>
    </tr>
</tbody>

【问题讨论】:

    标签: asp.net-mvc viewmodel nullreferenceexception


    【解决方案1】:

    如果我正确理解所有内容,当 POST 请求发送到 CheckUser 控制器操作时,您会收到 NullReferenceException。此操作不会创建模型并在此处返回没有模型的视图:

            // redirect to view
            return View("Index");
    

    或这里:

            return View("LogIn");
    

    您可以检查您的Model 在您的视图中是否不为空,如其他答案中所述,但这只会避免引发异常,用户仍会看到一个空表。要显示一些数据,您不需要直接从 CheckUser 方法返回视图,而是将它们重定向到 GET 操作:

     public ActionResult CheckUser()
     {
         //check username & password
        if ((Request.Form["username"] == "user") && (Request.Form["password"] == "pass"))
        {
            // use forms auth class to set the cookie
            FormsAuthentication.SetAuthCookie(Request.Form["username"], true);
            // redirect to view
            return RedirectToAction("Index");
        }
        else
        {
            return RedirectToAction("Login");
        }
     }
    

    【讨论】:

    • 谢谢你takemyoxygen,这已经解决了我的问题,我现在明白为什么了:)
    【解决方案2】:
    If ( Model != null ) {
    
    @foreach (var item in Model)
                                        {
    
    }
    }
    

    【讨论】:

      【解决方案3】:

      我认为某些或您的 filterresults 项具有 UserCode 属性 = null 并且会产生异常。用

      替换你的过滤器
      filterresults = filterresults.Where(x => x.UserCode != null 
            && x.UserCode.ToString().Contains(filtername)).OrderBy(x => x.UserCode);
      

      【讨论】:

      • 嗨,DaniCE,我尝试使用上面的代码,但没有解决错误,该表确实包含带有 null 的列,但 appmodeid 和 creationdatetime 都有每一行的数据(尽管可以为 null)跨度>
      • 这个查询很可能会被转换为纯 SQL 并且不会抛出 NullReferenceException,即使某些值实际上是 nulls
      【解决方案4】:
      @if(Model != null) 
      {
          foreach (var item in Model)
          {
              // do your code
          }
      }
      

      【讨论】:

        【解决方案5】:

        我对此很陌生,但我刚刚通过更换控制器解决了这个绝对噩梦。我做了这个,它工作。这是一个奇迹

        public async Task<IActionResult> Administration()
        {
            return View(await _context.Cause.ToListAsync());
        }
        

        【讨论】:

          猜你喜欢
          • 2018-09-01
          • 2014-06-15
          • 1970-01-01
          • 1970-01-01
          • 2014-03-23
          • 2022-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多