我正在使用ajax动态地将项添加到字段列表中。
问题是这些项目没有正确的ID或名称,因此它们无法正确映射,并且在提交表单时不会反映在模型中。
这是我的代码的结构:
public class Main
{
public IEnumerable<FieldSection> Sections { get; set; }
}
public class FieldSection
{
public virtual IList<Field> Fields { get; set; }
}
public class Field
{
[Required]
public string Value { get; set; }
}
这就是我渲染Main的方式:
<div class="field-sections">
<div id="sections">
@Html.EditorFor(model => model.Sections)
</div>
<p>
<span class="add-section">Add Section</span>
</p>
</div>
一个Section有一个这样的EditorTemplate:
<div class="field-list">
@Html.EditorFor(model => model.Fields)
</div>
<p>
<span class="add-field">Add Field</span>
</p>
Field有一个这样的EditorTemplate:
<div class="editor-field">
@Html.LabelFor(model => model.Value)
@Html.EditorFor(model => model.Value)
@Html.ValidationMessageFor(model => model.Value)
</div>
如果我有一个部分和两个字段,则Value
字段的最后一个文本框的ID为Sections_0__Fields_1__Value
,名称为Sections[0].Fields[1].Value
。
我通过呈现我的EditorTemplate Field
,通过ajax添加Field.cshtml
,将其返回到页面并将其添加到该部分。但是,ID为Value
,名称为Value
。
这显然是不正确的。在我使用javascript将其添加到页面之前,我似乎可以修改我的HTML以给它正确的ID /名称,但这是一个非常糟糕的解决方案。如何使用正确的名称和ID来呈现我的视图?或者我是以错误的方式接近这个?
修改
渲染字段代码:
[HttpGet]
public string Field()
{
return MvcRenderUtility.RenderToString(this, "EditorTemplates/TemplateField", new TemplateField());
}
渲染实用程序:
public static class MvcRenderUtility
{
public static string RenderToString(Controller controller, string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
controller.ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
}
答案 0 :(得分:0)
我建议你在浏览器中添加字段,也许使用jQuery,并在post action方法中检索新字段的值:
public ActionResult Edit(MyModel model, FormCollection raw) {
// scan the raw collection for new fields and add them to your model
}