C# Asp.net MVC 5-视图向控制器发布空数据

C# Asp.net MVC 5-视图向控制器发布空数据,c#,html,asp.net-mvc,razor,asp.net-mvc-5,C#,Html,Asp.net Mvc,Razor,Asp.net Mvc 5,我正在开发一个使用视图模型将数据传递给视图的应用程序,但是,当我试图保存用户对数据所做的更改并将其发回控制器以进行处理并存储在数据库中时,我的视图模型中的所有内容都会得到空值。我在这里尝试了各种其他问题,但我发现没有一个答案能够解决这个问题。我认为这和我使用列表框来显示一些数据有关,但我对ASP.NETMVC5相当陌生,不太确定我需要在这里做什么 下面是我的视图模型、控制器的相关部分和视图的代码 查看模型 public class OrganizationViewModel { publ

我正在开发一个使用视图模型将数据传递给视图的应用程序,但是,当我试图保存用户对数据所做的更改并将其发回控制器以进行处理并存储在数据库中时,我的视图模型中的所有内容都会得到空值。我在这里尝试了各种其他问题,但我发现没有一个答案能够解决这个问题。我认为这和我使用列表框来显示一些数据有关,但我对ASP.NETMVC5相当陌生,不太确定我需要在这里做什么

下面是我的视图模型、控制器的相关部分和视图的代码

查看模型

public class OrganizationViewModel
{
    public Organization Organization { get; set; }
    public IEnumerable<SelectListItem> RelatedContacts { get; set; }
}
公共类组织视图模型
{
公共组织{get;set;}
public IEnumerable 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>
}
[HttpGet]
公共操作结果编辑(组织)
{
IEnumerable contacts列表=获取联系人(组织);
var viewModel=new OrganizationViewModel()
{
组织=组织,
RelatedContacts=联系人列表
};
返回视图(“编辑”,视图模型);
}
从视图接收数据

[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>
}
[HttpPost]
公共操作结果保存组织(OrganizationViewModel OrganizationViewModel)
{
organizationViewModel.Organization.Id=(int)TempData[“Id”];
organizationViewModel.Organization.LastEdited=DateTime.Today;
organizationViewModel.Organization.DateAdd=(DateTime)TempData[“DateAdd”];
TempData.Clear();
if(ModelState.IsValid)
{
organizationRepository.SaveOrganization(organizationViewModel.Organization);
返回重定向到操作(“索引”、“组织”);
}
IEnumerable contactsList=GetContacts(organizationViewModel.Organization);
var viewModel=new OrganizationViewModel()
{
Organization=organizationViewModel.Organization,
RelatedContacts=联系人列表
};
返回视图(“编辑”,视图模型);
}
编辑视图

[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>
}

编辑@(模型.组织.名称)
@使用(Html.BeginForm(“SaveOrganization”、“Organization”、FormMethod.Post))
{
@Html.HiddenFor(m=>Model.Organization.Name)
机构名称
@TextBox(“Name”,null,new{@class=“form control”})
地址
@TextArea(“Address”,null,new{@class=“form control”})
相关联系人
@Html.ListBox(“RelatedContacts”,Model.RelatedContacts,new{@class=“form control”,size=10})
自定义字段

笔记 @TextArea(“Notes”,null,10500,new{@class=“form control”,@style=“width:100%;max width:100%;”) @ActionLink(“取消并返回列表”,“取消编辑添加”,空,新{@class=“btn btn default”}) }

如果有人无意中发现了这一点,并希望看到我根据@Stephen Muecke的评论所做的确切更改,请回答我自己的问题

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


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

在表单控件中生成与模型完全没有关系的
名称
属性。始终使用强类型方法-
@Html.TextBoxFor(m=>m.organization.Name)
--然后比较这两种情况下的
名称
属性,以了解编码不起作用的原因。但是,视图模型在编辑数据时不包含数据模型。它们包含您在视图中需要的数据模型的属性。请参阅,谢谢!问题的固定部分--我现在在v中获取组织的数据回发时查看模型,但相关联系人仍然没有显示任何内容。目前我只使用列表框显示数据,最终我将在以后的实现中使用其中的选择。您尚未显示模型或其属性!并且
无法绑定到集合或复杂对象-它发回一个简单属性数组(因此绑定tp的属性是(比如)
IEnumerable SelectedContacts
您需要做的最重要的事情是更改您的视图模型。它将不包含您的
Organization
属性。相反,它将包含您编辑的
Organization
的每个属性的属性,以及
IEnumerable
属性)