在回发期间遗失了一处房产

时间:2014-08-20 12:11:02

标签: asp.net-mvc razor many-to-many

这让我疯了。我正在尝试编辑多对多关系,遵循this不错的答案,但随着我添加了第二种关系,事情开始变得时髦。

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的共享模型并进行公开以确保它没有与之相关的东西(看看我有多绝望?)当然它没有。< / p>

我在想我错过了一些荒谬的东西......

如果需要,请随时索取更多代码。

编辑:我意识到我已经问了一个非主题的问题并且很抱歉,但我真的很沮丧,希望有人可以看一下大纲并说“哦,那,你只需要在那里调整一个,这将是一切都很好“。我想它比这更深入,所以这里添加的代码可以提出一个正确的问题:

控制器操作:

    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 个答案:

答案 0 :(得分:2)

经过多次拔毛后,我发现了几件事。

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>

那张照片有什么问题?那里有一个表格标签。

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)

然后我所有的麻烦都消失了。

正如我在问题中所说; &#34;我以为我错过了一些荒谬的事情。&#34;我是。