gpt4 book ai didi

asp.net-mvc-3 - 模型绑定(bind)器和隐藏字段

转载 作者:行者123 更新时间:2023-12-01 07:30:18 26 4
gpt4 key购买 nike

我有一个简化的测试场景,对问这个问题很有用:一个产品可以有很多组件,一个组件可以属于很多产品。 EF 生成了这些类,我将它们精简如下:

public partial class Product
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Component> Components { get; set; }
}
public partial class Component
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}

组件的创建是通过这些 Controller 操作完成的:
public ActionResult Create(int ProductId)
{
Product p = db.Products.Find(ProductId);
Component c = new Component();
c.Products.Add(p);
return PartialView(c);
}

[HttpPost]
public ActionResult Create(Component model)
{
db.Components.Add(model);
db.SaveChanges();
}

GET 方法返回的 View 如下所示:
@model Test.Models.Product

<fieldset>
<legend>Product</legend>
<div class="display-label">Name</div>
<div class="display-field">@Model.Name</div>
</fieldset>

@Html.Action("Create", "Component", new {ProductId = Model.Id})
<p>
@Html.ActionLink("Edit", "Edit", new { id=Model.Id }) |
@Html.ActionLink("Back to List", "Index")
</p>

从中可以看出,组件创建是通过上面的 Html.Action在同一页面上处理的- 该 View 的代码如下:
@model Test.Models.Component
@using Test.Models

<script type="text/javascript">
function Success() {
alert('ok');
}
function Failure() {
alert('err');
}
</script>
@using (Ajax.BeginForm("Create", "Component", new AjaxOptions
{
HttpMethod = "Post",
OnSuccess = "Success",
OnFailure = "Failure"
}))
{
<fieldset>
<legend>Components</legend>

<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
@Html.HiddenFor(x => x.Products.First().Id)
@Html.HiddenFor(x => x.Products)
@foreach (Product p in Model.Products)
{
@Html.Hidden("Products[0].Id", p.Id)
}
@foreach (Product p in Model.Products)
{
@Html.Hidden("[0].Id", p.Id)
}
</fieldset>
<input type="submit" value="go" />
}

行。所以这就是我正在努力解决的问题:我需要 model [HttpPost]back 的参数以正确填充,即它应该包含一个产品,因为我无法使用空产品创建新组件。要获得产品,我需要通过产品的 id 进行查找。我希望我应该能够做到:
model.Products.Add(db.Products.Find(model.Products.First().Id));

或类似的东西,它依赖于 model收到身份证。这意味着 View 必须将 id 放在那里,大概是在一个隐藏字段中,从我的 View 代码中可以看出,我已经多次尝试填充它,但都失败了。

通常我更喜欢 *For 方法,因为它们负责生成正确的命名法。如果 .Products 是单数 (.Product),我可以将其引用为 x => x.Product.Id一切都会好的,但由于它是复数,我不能这样做 x => x.Products.Id所以我尝试了 x => x.Products.First().Id它编译并产生正确的值但得到名称 Id (这是错误的,因为模型绑定(bind)器认为它是 Component.Id 而不是 Component.Products[0].Id

我的第二次尝试是让 HiddenFor迭代(就像我用 EditorFor 一样):
@Html.HiddenFor(x => x.Products)

但这什么也没产生——我读过这个助手不会迭代。我试过 x => x.Products.First()但这甚至无法编译。最后,我决定放弃 *For 并自己编写名称:
@foreach (Product p in Model.Products)
{
@Html.Hidden("Products[0].Id", p.Id)

虽然看起来不错,但回发看不到我的值(value)( Products.Count == 0)。我在一些帖子中看到格式应该类似于 [0].Id但这也不起作用。呜呜……

我收集我可以这样编码:
@Html.Hidden("ProductId", p.Id)

然后像这样重新声明我的 Controller 操作:
[HttpPost] ActionResult Create(Component model, int ProductId)

但这似乎很古怪。很难相信这是如此困难。谁能帮忙?
  • e

  • p.s.我有一个项目,如果有人关心,我可以下载

    最佳答案

    而不是写那些 foreach循环尝试使用编辑器模板:

    <fieldset>
    <legend>Components</legend>

    <div class="editor-label">
    @Html.LabelFor(model => model.Name)
    </div>

    <div class="editor-field">
    @Html.EditorFor(model => model.Name)
    @Html.ValidationMessageFor(model => model.Name)
    </div>

    @Html.EditorFor(x => x.Products)
    </fieldset>

    并在相应的编辑器模板中( ~/Views/Shared/EditorTemplates/Product.cshtml )
    @model Product
    @Html.HiddenFor(x => x.Id)

    关于asp.net-mvc-3 - 模型绑定(bind)器和隐藏字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6068678/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com