Asp.net MVC 5 - 查看将空数据发布到控制器

时间:2018-02-21 21:32:02

标签: c# html asp.net-mvc razor asp.net-mvc-5

我正在使用一个使用View Model将数据传递给视图的应用程序,但是当我尝试保存更改时,用户对数据进行更改并将其发送回控制器以进行处理并存储在数据库中,我在视图模型中获取了所有内容的空值。我在这里尝试了其他各种问题,我发现的答案都没能解决这个问题。我认为它与我使用ListBox显示一些数据有关,但我对ASP.net MVC 5还不太新,我不太清楚我需要做什么。

以下是我的视图模型的代码,控制器的相关部分以及视图。

查看模型

public class OrganizationViewModel
{
    public Organization Organization { get; set; }
    public IEnumerable<SelectListItem> RelatedContacts { get; set; }
}

从控制台发送数据到视图

[HttpGet]
    public ActionResult Edit(Organization organization)
    {
        IEnumerable<SelectListItem> contactsList = GetContacts(organization);
        var viewModel = new OrganizationViewModel()
        {
            Organization = organization,
            RelatedContacts = contactsList
        };

        return View("Edit", viewModel);
    }

从视图接收数据

[HttpPost]
    public ActionResult SaveOrganization(OrganizationViewModel organizationViewModel)
    {
        organizationViewModel.Organization.Id = (int)TempData["Id"];
        organizationViewModel.Organization.LastEdited = DateTime.Today;
        organizationViewModel.Organization.DateAdded = (DateTime)TempData["DateAdded"];
        TempData.Clear();
        if (ModelState.IsValid)
        {
            organizationRepository.SaveOrganization(organizationViewModel.Organization);
            return RedirectToAction("Index", "Organization");
        }

        IEnumerable<SelectListItem> contactsList = GetContacts(organizationViewModel.Organization);
        var viewModel = new OrganizationViewModel()
        {
            Organization = organizationViewModel.Organization,
            RelatedContacts = contactsList
        };
        return View("Edit", viewModel);
    }

编辑视图

<div class="panel">
<div class="panel-heading">
    <h3>Editing @(Model.Organization.Name)</h3>
</div>

@using (Html.BeginForm("SaveOrganization", "Organization", FormMethod.Post))
{
    <div class="panel-body">
        @Html.HiddenFor(m => Model.Organization.Name)
        <div class="row">
            <div class="col-md-3 form-group">
                <label>Organization Name</label>
                @Html.TextBox("Name", null, new { @class = "form-control" })
            </div>
            <div class="col-md-3 form-group">
                <label>Address</label>
                @Html.TextArea("Address", null, new { @class = "form-control" })
            </div>
        </div>
        <div class="row">
            <div class="col-md-3 form-group">
                <label>Related Contacts</label>
                @Html.ListBox("RelatedContacts", Model.RelatedContacts, new { @class = "form-control", size = 10 })
            </div>
            <div class="col-md-3 form-group">
                <label>Custom Fields</label>
                <br />
                <input type="button" value="Add New Field" class="btn btn-default" />
            </div>
        </div>
        <div class="row">
            <div class="col-md-12 form-group">
                <label>Notes</label>
                @Html.TextArea("Notes", null, 10, 500, new { @class = "form-control", @style = "width: 100%; max-width: 100%;" })
            </div>
        </div>
    </div>
    <div class="panel-footer">
        <input type="submit" value="Save" class="btn btn-primary" />
        @Html.ActionLink("Cancel and return to List", "CancelEditOrAdd", null, new { @class = "btn btn-default" })
    </div>
}

1 个答案:

答案 0 :(得分:1)

回答我自己的问题,让任何人偶然发现这一点,并希望根据@Stephen Muecke的评论看到我所做的确切更改。

将所有@html.something()s更改为@html.somethingfor()s以修复未在视图模型中接收组织的回发数据的问题,然后我在视图模型中创建了一个新属性以与所选ListBox中的索引,现在显示为@Html.ListBoxFor(m => m.SelectedIndexes, Model.RelatedContacts, ...)。我现在获得了所有正确的回发数据,并且可以将所选索引与组织的相关联系人联系起来。

编辑:还更改了我的视图模型以包含组织类的属性,而不是实际的组织对象本身作为属性。