【发布时间】:2011-10-11 05:24:01
【问题描述】:
从模型生成隐藏变量时,仅使用变量名称。如果使用模型外的嵌套类/结构,则使用类/结构名称。这有助于发布表单,因为系统更容易看到它正在填写的对象。
但是,在使用局部视图时,我经常传入模型的部分内容,这意味着隐藏字段中不再包含结构/类名称。在为回发重建参数时,这可能会导致冲突或数据丢失。有没有办法让 Html.HiddenFor (或等价物)将类/结构名称放在前面?
【问题讨论】:
标签: c# asp.net-mvc razor
从模型生成隐藏变量时,仅使用变量名称。如果使用模型外的嵌套类/结构,则使用类/结构名称。这有助于发布表单,因为系统更容易看到它正在填写的对象。
但是,在使用局部视图时,我经常传入模型的部分内容,这意味着隐藏字段中不再包含结构/类名称。在为回发重建参数时,这可能会导致冲突或数据丢失。有没有办法让 Html.HiddenFor (或等价物)将类/结构名称放在前面?
【问题讨论】:
标签: c# asp.net-mvc razor
两种选择:
使用Html.EditorFor(..) 而不是直接的局部视图。 EditorFor 考虑了用于访问属性的前缀/层次结构,或者,
在渲染子部分之前操作 TemplateInfo.HtmlFieldPrefix,这将导致子渲染的每个字段都自动添加前缀。
如果您选择选项 (2),请考虑声明一个帮助程序,它将包装 HtmlFieldPrefix 操作,以防止您忘记重置它(我在某段时间从其他地方撕下了下面 ChildPrefixScope 的代码以前)。
例如:
static public class MyHtmlHelpers
{
public static IDisposable BeginChildScope<TModel>(this HtmlHelper<TModel> html, string parentScopeName)
{
return new ChildPrefixScope(html.ViewData.TemplateInfo, parentScopeName);
}
private class ChildPrefixScope : IDisposable
{
private readonly TemplateInfo _templateInfo;
private readonly string _previousPrefix;
public ChildPrefixScope(TemplateInfo templateInfo, string collectionItemName)
{
this._templateInfo = templateInfo;
_previousPrefix = templateInfo.HtmlFieldPrefix;
templateInfo.HtmlFieldPrefix = collectionItemName;
}
public void Dispose()
{
_templateInfo.HtmlFieldPrefix = _previousPrefix;
}
}
}
【讨论】: