gpt4 book ai didi

javascript - 为各种模型动态创建隐藏表单字段(MVC 4)

转载 作者:行者123 更新时间:2023-11-30 16:58:40 25 4
gpt4 key购买 nike

我正在尝试为一组属性动态创建隐藏字段,但在提交表单时出现 500 服务器错误。我确认了以下内容:

  • 我在 foreach 语句中迭代的属性是正确的。
  • property.Name 是 NewItem.GetType() 检索到的类型的有效属性名称

这是我所拥有的:

查看

@model PaneViewModel

using (Ajax.BeginForm("AddItem", "Action", new AjaxOptions
{
UpdateTargetId = "tool-wrapper",
HttpMethod = "POST",
}))
{
// Some standard input fields here (these are working properly).

[...]

// Here's what's broken:
@foreach (var property in Model.NewItem.GetType().GetProperties().Where(<criteria here>))
{
@Html.HiddenFor(m => m.NewItem.GetType().GetProperty(property.Name), column.GetValue(Model.NewItem, null))
}

<button type="submit">Add</button>
}

ItemViewModel

public class ItemViewModel
{
public int SomeField { get; set; }
public int AnotherField { get; set; }
}

PaneViewModel

public class PaneViewModel
{
public ItemViewModel NewItem { get; set; }
}

Controller

[HttpPost]
public ActionResult AddItem([Bind(Prefix = "NewItem")] ItemViewModel model)
{
// Stuff here.
}

值得注意的是,以下代码会在生成的 HTML 中生成具有正确名称和值的隐藏字段,但隐藏字段的值不会发布到 Controller 操作:

@foreach (var property in Model.NewItem.GetType().GetProperties().Where(<criteria here>))
{
@Html.Hidden(property.Name, column.GetValue(Model.NewItem, null))
}

看来问题出在 m => m.NewItem.GetType().GetProperty(property.Name) 组件

最佳答案

  1. 这种类型的逻辑不属于 View
  2. Html.HiddenFor()期望表达式 ( Expression<Func<TModel,
    TProperty>>
    ) 作为第一个参数,但是 .GetProperty()返回类型PropertyInfo
  3. 您不应为属性生成多个隐藏输入您的模型,而是使用 View 模型来仅表示什么你需要编辑(它通过发送额外的数据来降低性能客户端,然后将其原样发回,任何人可以使用 FireBug 或类似的工具来更改值,你可能一点都不明智。

但是,如果您确实想这样做,您可以创建一个 html 帮助器,为所有标有 [HiddenInput] 的属性生成隐藏输入。属性(或修改此示例以传递一些过滤所需属性的条件)

public static MvcHtmlString HiddenForModel<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
{
StringBuilder html = new StringBuilder();
ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
var properties = metaData.Properties.Where(p => p.TemplateHint == "HiddenInput");
foreach(var property in properties)
{
html.Append(helper.Hidden(property.PropertyName));
}
return MvcHtmlString.Create(html.ToString());
}

请注意,这也会生成 iddata-val-*可能不需要的属性,因此您可以使用

最小化生成的 html
foreach(var property in properties)
{
TagBuilder input = new TagBuilder("input");
input.MergeAttribute("type", "hidden");
input.MergeAttribute("name", property.PropertyName);
input.MergeAttribute("value", string.Format("{0}", property.Model));
html.Append(input.ToString());
}

关于javascript - 为各种模型动态创建隐藏表单字段(MVC 4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29246467/

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