【问题标题】:When I open the view I have null object in model mvc当我打开视图时,模型 mvc 中有空对象
【发布时间】:2017-12-04 14:27:03
【问题描述】:

大家好消息。我有一个小问题。我无法在表格中显示数据。我将代码移到 HomeContoller 并修复了空对象的错误。

家庭控制器

using NarkomApp.Models;

使用 System.Collections.Generic; 使用 System.Web.Mvc;

命名空间 NarkomApp.Controllers { 公共类 HomeController : 控制器 { NarkomEntities dbModel = new NarkomEntities();

    public ActionResult Index()
    {
        return View();
    }

    public ActionResult PersonalPage()
    {
        PersonalPageModel personalPageModel = new PersonalPageModel();

        List<USERS> list_Users = new List<USERS>();
        List<PERSONAL_INF> list_PersonalInf = new List<PERSONAL_INF>();

        personalPageModel.list_Users = list_Users;
        personalPageModel.list_PersonalInf = list_PersonalInf;

        personalPageModel.ChangePasswordErrorMessage = "Новый пароль совпадает со старым!";

        return View("~/Views/Home/PersonalPage.cshtml", personalPageModel);
    }

    public ActionResult AddOrEdit()
    {
        return View();
    }

    public ActionResult LogOut()
    {
        int iIdUser = (int)Session["iIdUsers"];
        Session.Abandon();
        return RedirectToAction("Index", "Home");
    }

}

查看代码:

@model NarkomApp.Models.PersonalPageModel


@if (Model != null)
        {
            <table border="0">

                <tr>
                    <td colspan="2"><h2>Персональные данные</h2></td>
                    <td></td>
                </tr>

                @foreach (var personalInf in Model.list_PersonalInf)
                {
                    <tr>
                        <td><p>Город:</p></td>
                        <td>@Html.Label(@personalInf.vCity, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>ФИО:</p></td>
                        <td>@Html.Label(@personalInf.vFIO, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Индекс:</p></td>
                        <td>@Html.Label(@personalInf.vIndex, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Населенный пункт:</p></td>
                        <td>@Html.Label(personalInf.vLocality, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Улица:</p></td>
                        <
                        <td>@Html.Label(@personalInf.vStreet, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Дом/корпус/строение:</p></td>
                        <td>@Html.Label(@personalInf.vHome, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Квартира:</p></td>
                        <
                        <td>@Html.Label(@personalInf.vApartment, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Телефон:</p></td>
                        <td>@Html.Label(@personalInf.vPhone, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                }

                <tr>
                    <td colspan="2"><hr /></td>
                    <td></td>
                </tr>

                <tr>
                    <td colspan="2"><h2>Форма изменения данных</h2></td>
                    <td></td>
                </tr>

                @foreach (var personalInf in Model.list_PersonalInf)
                {
                    <tr>
                        <td><p>Город:</p></td>
                        <td>@Html.Editor(@personalInf.vCity, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>ФИО:</p></td>
                        <td>@Html.Editor(@personalInf.vFIO, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Индекс:</p></td>
                        <td>@Html.Editor(@personalInf.vIndex, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Населенный пункт:</p></td>
                        <td>@Html.Editor(personalInf.vLocality, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Улица:</p></td>
                        <
                        <td>@Html.Editor(@personalInf.vStreet, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Дом/корпус/строение:</p></td>
                        <td>@Html.Editor(@personalInf.vHome, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Квартира:</p></td>
                        <
                        <td>@Html.Editor(@personalInf.vApartment, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>
                    <tr>
                        <td><p>Телефон:</p></td>
                        <td>@Html.Editor(@personalInf.vPhone, new { htmlAttributes = new { @class = "form-control" } })</td>
                    </tr>


                    <tr>
                        <td><input type="submit" value="Изменить" class="btn-submit" /></td>
                        <td><input type="reset" value="Очистка" class="btn-submit" /></td>
                    </tr>

                }


                <tr>
                    <td colspan="2"><hr /></td>
                    <td></td>
                </tr>

                <tr>
                    <td colspan="2"><h2>Форма изменения пароля</h2></td>
                    <td></td>
                </tr>

                @foreach (var users in Model.list_Users)
                {
                    <tr>
                        <td><p>Старый пароль:</p></td>
                        <td>
                            @Html.Editor(Model.NewPassword, new { htmlAttributes = new { @class = "form-control" } })<br />
                            @Html.ValidationMessage(Model.NewPassword, "", new { @class = "text-danger" })
                        </td>
                    </tr>

                    <tr>
                        <td><p>Новый пароль:</p></td>
                        <td>
                            @Html.Editor(@users.vPassword, new { htmlAttributes = new { @class = "form-control" } })<br />
                            @Html.ValidationMessage(@users.vPassword, "", new { @class = "text-danger" })
                        </td>
                    </tr>

                    <tr>
                        <td><p>Подтвердите пароль:</p></td>
                        <td>
                            @Html.Editor(@users.ConfirmPassword, new { htmlAttributes = new { @class = "form-control" } })<br />
                            @Html.ValidationMessage(@users.ConfirmPassword, "", new { @class = "text-danger" })
                        </td>
                    </tr>
                }


                <tr>
                    <td><input type="submit" value="Изменить" class="btn-submit" /></td>
                    <td><input type="reset" value="Очистка" class="btn-submit" /></td>
                </tr>

                <tr>
                    <td colspan="2"><hr /></td>
                    <td></td>
                </tr>

                <tr>
                    <td colspan="2"><p>Подписаться на рассылку</p> @Html.CheckBox("cbIsSendInf", true)</td>
                    <td></td>
                </tr>

                <tr>
                    <td colspan="2"><hr /></td>
                    <td></td>
                </tr>

                <tr>
                    <td colspan="2">@Html.ActionLink("Выход из аккаунта!", "LogOut", "Home", null, new { @class = "form-control" })</td>
                    <td></td>
                </tr>

            </table>

        } @* End if *@
        else
        {
            <h2>Проблема с сессией, пустой объект!</h2>
        }

【问题讨论】:

  • 查看您的视图模型会有所帮助
  • 您在这里所做的并不完全清楚,但看起来您正在控制器本身上创建视图模型。不要那样做。在 action 方法中创建一个实例。控制器会随每个请求进行实例化和处理,因此如果您认为可以在操作之间共享此实例,那您就错了。

标签: c# asp.net-mvc asp.net-mvc-4 view


【解决方案1】:

在操作Method 中创建您的视图Model 的实例,如下所示:

//PersonalPageModel personalPageModel = new PersonalPageModel();---> remove this

    // GET: PersonalPage
    public ActionResult PersonalPage()
    {
        PersonalPageModel personalPageModel = new PersonalPageModel(); // use here in the action method instead
        List<USERS> list_Users = new List<USERS>();
        List<PERSONAL_INF> list_PersonalInf = new List<PERSONAL_INF>();

        personalPageModel.list_Users = list_Users;
        personalPageModel.list_PersonalInf = list_PersonalInf;

        personalPageModel.ChangePasswordErrorMessage = "Новый пароль совпадает со старым!";

        return View("~/Views/Home/PersonalPage.cshtml", personalPageModel);
    }

不要像以前那样在 Controller 中实例化它,它可能会暴露出计划外的修改,而且正如 Chris Pratt 指出的那样,它并不是最好的。

【讨论】:

  • 我这样做了。我有新问题。不显示在表格中的个人信息。只是带有标准 html 行的空表。我做错了什么?
  • 这是因为你没有在你的模型中填充个人信息字段,它只是被初始化了。
【解决方案2】:

我认为只返回一个新的PersonalPageModel 比只编辑每个操作更好。请记住,任何 Web 应用程序中的每个控制器都是无状态的 - 因此您不会在另一个请求中拥有相同的对象(ofc 您可以拥有静态对象,但我认为在这种情况下使用静态模型并不好)

我认为这应该可以解决您的情况:

  return View("~/Views/Home/PersonalPage.cshtml", new PersonalPageModel(){ 
            ChangePasswordErrorMessage = "Новый пароль совпадает со старым!",
            list_Users  = new List<USERS>(),
            list_PersonalInf  = new List<PERSONAL_INF>()
  });

现在,在您的每个请求中,您都会创建一个 PersonalPageModel 的新对象,我认为这并不好。

【讨论】:

  • 它不工作。我试图添加您的退货请求,但没有任何反应。也许您可以编写所有文本程序?也许我错过了什么。
  • 您确定在 PersonalPage View 中检查模型吗?在渲染页面的开头是模型仍然为空?
【解决方案3】:

尝试将PersonalPageModel personalPageModel = new PersonalPageModel(); 放入您的ActionResult 中,或者如果您想将其放在外面,请尝试为您的模型指定publicprivate。希望对您有所帮助!

附:在调试模式下运行并在返回之前放置一个断点。检查您的变量并查看其中包含的内容,我希望这可以帮助您缩小问题范围!

【讨论】:

  • 我还没有 50 声望来发布 cmets,所以我只是想帮助人们。给您带来的不便深表歉意:)
猜你喜欢
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多