我正在编写自定义的HtmlHelper
扩展方法,有时我想要使用标准EditorExtensions
方法Html.Editor
。唯一的问题是我还希望结果元素具有特定的值(我在运行时从代码中解析)。
我尝试将我的值作为additionalViewData
参数中的HTML属性传递:
// Simplified method for illustrative purposes
public static MvcHtmlString MyCustomEditor(this HtmlHelper html, string expression, string externallyResolvedValue)
{
var additionalViewData = new { htmlAttributes = new { value = externallyResolvedValue } };
return html.Editor(expression, additionalViewData);
}
不幸的是,这失败了,我认为(没有开始反编译程序集)这是因为Editor
方法设置的值在value
获取后绑定到additionalViewData
属性处理(例如,我可以使用此机制设置其他HTML属性,它只是value
失败了。)
显然,我知道我可以使用JQuery设置元素的值,但问题是我无法轻松地从代码中知道Javascript的externallyResolvedValue
。此外,对MyCustomEditor
的调用会有很多,所以如果可能的话,那么更完整的机制肯定是在代码中执行它。
有什么好主意吗?
修改
刚刚发生的另一个可能的解决方案是对结果MvcHtmlString
执行正则表达式并手动替换value
,但这看起来更像是一个黑客而不是修复...它似乎应该有一个更优雅的解决方案。
答案 0 :(得分:1)
查看 - 并模仿 - MVC源代码可能比您想象的更容易,并且比解决它更容易。
看看这些例子: GitHub Asp.Net MVC repo: DefaultEditorTemplates.cs
private static string HtmlInputTemplateHelper(HtmlHelper html, string inputType, object value)
{
return html.TextBox(
name: String.Empty,
value: value,
htmlAttributes: CreateHtmlAttributes(html, className: "text-box single-line", inputType: inputType))
.ToHtmlString();
}
GitHub Asp.Net MVC repo: InputExtensions.cs
public static MvcHtmlString TextBox(this HtmlHelper htmlHelper, string name)
{
return TextBox(htmlHelper, name, value: null);
}
public static MvcHtmlString TextBox(this HtmlHelper htmlHelper, string name, object value)
{
return TextBox(htmlHelper, name, value, format: null);
}
public static MvcHtmlString TextBox(this HtmlHelper htmlHelper, string name, object value, string format)
{
return TextBox(htmlHelper, name, value, format, htmlAttributes: (object)null);
}
你可以看到有一些带有值参数的重载。您可以使用Html.Editor()
替换代码中的Html.TextBox()
吗?