将值传递给Html.Editor扩展方法

时间:2015-02-19 11:10:24

标签: c# html razor

我正在编写自定义的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,但这看起来更像是一个黑客而不是修复...它似乎应该有一个更优雅的解决方案。

1 个答案:

答案 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()吗?