我快疯了。我正试图编辑一个多对多关系,遵循这个不错的答案,但当我添加第二个关系时,事情开始变得时髦。
public ActionResult Edit(Style style)
{
var accessoryIDs = style.SelectedAccessories.Select(a => a.ID);
var fabricIDs = style.SelectedFabrics.Select(f => f.ID);
当首先加载style
进行编辑时,两个列表都被填充,一切正常。所以我编辑并保存。style.SelectedAccesories
没问题,style.SelectedFabrics
为空!在我看来,我在面料编辑器上面有一个配饰编辑器。如果我交换这两个,那么面料在配饰之前,配饰是空的,而面料不是。
我从两个Selected
的共享模型开始,并发布以确保它没有与之相关的东西(看到我有多绝望吗?)当然没有。
我在想我错过了一些可笑的事情。
如果你需要更多的代码,请随时要求。
编辑:我意识到我问了一个离题的问题,很抱歉,但我真的很沮丧,希望有人能看着大纲说"哦,那个,你只需要调整一下那里,它就会很好"。我猜它比这更深入,所以这里的代码添加一个适当的问题:
控制器动作:
public ActionResult Edit(int? id)
{
var style = db.Styles.Include(s => s.Fabrics).Include(s => s.Accessories).FirstOrDefault(s => s.ID == id);
style.SelectedAccessories = db.Accessories.Select(f => new SelectedAccessory { ID = f.ID, Text = f.Name }).ToList();
style.SelectedFabrics = db.Fabrics.Select(f => new SelectedFabric { ID = f.ID, Text = f.Name }).ToList();
return View(style); // As said, the two above aren't null at this point
}
[HttpPost]
public ActionResult Edit(Style style)
{
var accessoryIDs = style.SelectedAccessories.Where(s => s.IsSelected).Select(s => s.ID);
// This one (style.SelectedFabrics) is now null
var fabricIDs = style.SelectedFabrics.Where(s => s.IsSelected).Select(s => s.ID);
return View(style);
}
编辑视图:
@model Styleinfo.Models.Style
@using (Html.BeginForm())
{
<div class="form-horizontal">
@*swapping around makes the last of the two null in the controller*@
@Html.EditorFor(model => model.SelectedAccessories)
@Html.EditorFor(model => model.SelectedFabrics)
<input type="submit" value="Save" class="btn btn-default" />
</div>
}
编辑器视图(SelectedFabric
用于面料,它们与前面提到的相同):
@model Styleinfo.Models.SelectedAccessory
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.ID)
@Html.LabelFor(model => model.IsSelected, Model.Text)
@Html.EditorFor(model => model.IsSelected)
}
模型:
public partial class Style
{
public IEnumerable<SelectedFabric> SelectedFabrics { get; set; }
public IEnumerable<SelectedAccessory> SelectedAccessories { get; set; }
}
public class SelectedAccessory // Again, SelectedFabric, otherwise identical
{
public int ID { get; set; }
public string Text { get; set; }
public bool IsSelected { get; set; }
}
T-SQL创建简化的数据库,因此Style
的其余部分:
-- Creating table 'Fabrics'
CREATE TABLE [dbo].[Fabrics] (
[ID] int IDENTITY(1,1) NOT NULL,
[Name] nvarchar(max) NOT NULL,
);
GO
-- Creating table 'Styles'
CREATE TABLE [dbo].[Styles] (
[ID] int IDENTITY(1,1) NOT NULL,
[Name] nvarchar(max) NOT NULL,
);
GO
-- Creating table 'Accessories'
CREATE TABLE [dbo].[Accessories] (
[ID] int IDENTITY(1,1) NOT NULL,
[Name] nvarchar(max) NOT NULL,
);
GO
-- Creating table 'FabricStyle'
CREATE TABLE [dbo].[FabricStyle] (
[Fabrics_ID] int NOT NULL,
[Styles_ID] int NOT NULL
);
GO
-- Creating table 'AccessoryStyle'
CREATE TABLE [dbo].[AccessoryStyle] (
[Accessories_ID] int NOT NULL,
[Styles_ID] int NOT NULL
);
GO
所以经过一番折腾,我发现了一些事情。
1:浏览器根本没有发回第二个编辑器的内容。这些值根本不在POST数据中。
所以我想我应该看看模型绑定,因为我看到其他人在这方面遇到了麻烦。唉,没用。
2:我决定看看交给浏览器的标记,我发现了这个
<div class="form-group">
<label class="control-label col-md-2" for="SelectedAccessories">Accessories</label>
<div class="col-md-10">
<form action="/Styles/Edit/1" method="post">
<input data-val="true" data-val-number="The field ID must be a number." data-val-required="Feltet ID skal udfyldes." id="SelectedAccessories_0__ID" name="SelectedAccessories[0].ID" type="hidden" value="1" />
<label for="SelectedAccessories_0__IsSelected">Accessory 1</label>
<input class="form-control check-box" data-val="true" data-val-required="Feltet IsSelected skal udfyldes." id="SelectedAccessories_0__IsSelected" name="SelectedAccessories[0].IsSelected" type="checkbox" value="true" />
<input name="SelectedAccessories[0].IsSelected" type="hidden" value="false" />
</form>
<span class="field-validation-valid text-danger" data-valmsg-for="SelectedAccessories" data-valmsg-replace="true"></span>
</div>
</div>
那么这张照片有什么问题呢?这里有一个form标签
3:所以回到编辑器。
@model Styleinfo.Models.SelectedAccessory
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.ID)
@Html.LabelFor(model => model.IsSelected, Model.Text)
@Html.EditorFor(model => model.IsSelected)
}
我删除了Html.BeginForm()
,因此
@model Styleinfo.Models.SelectedAccessory
@Html.HiddenFor(model => model.ID)
@Html.LabelFor(model => model.IsSelected, Model.Text)
@Html.EditorFor(model => model.IsSelected)
然后我所有的烦恼都消失了。
正如我在问题中所说的;"我在想我错过了一些可笑的东西……"我确实错过了。