'System.Action'不带1个参数HtmlHelper MVC3

时间:2011-07-04 13:12:49

标签: asp.net-mvc-3 exception razor telerik html-helper

我在mvc3中使用html助手时遇到异常。当使用LabelFor和TextAreaFor以及类的“虚拟”参数时,我最初得到了异常。当我删除虚拟关键字时,它工作正常。

我现在要添加一个LabelFor和一个RadioBoxForEnum(自定义助手),这些使用枚举(非虚拟),我再次获得异常。

不确定它是否有任何区别,但我已将其放入Telerik标签中。

例外是:

CS1593: Delegate 'System.Action' does not take 1 arguments

以下是代码:

items.Add().Text("Categorisation").Content(@<text>
        <div class="TabContent">
            <div class="5050SplitLeft">
                @Html.LabelFor(o => o.ChangeProposalHeader.ChangeProposal.ProgrammeCategory, "Programme:")
                @Html.TextAreaFor(o => o.ChangeProposalHeader.ChangeProposal.ProgrammeCategory
                <br />
                @Html.LabelFor(o => o.ChangeProposalHeader.ChangeProposal.InterfaceCategory, "Interface:")
                @Html.TextAreaFor(o => o.ChangeProposalHeader.ChangeProposal.InterfaceCategory)
                <br />
                @Html.LabelFor(o => o.ChangeProposalHeader.ChangeProposal.TechnicalReadinessCategory, "Technical Readiness Level:")
                @Html.TextAreaFor(o => o.ChangeProposalHeader.ChangeProposal.TechnicalReadinessCategory)
                <br />
                @Html.LabelFor(o => o.ChangeProposalHeader.ChangeProposal.DesignChangeRequirementCategory, "Design Change Requirement Category:")
                @Html.TextAreaFor(o => o.ChangeProposalHeader.ChangeProposal.DesignChangeRequirementCategory)
                <br />
                @Html.LabelFor(o => o.ChangeProposalHeader.ChangeProposal.FitType, "Fit Type:")
                @Html.RadioButtonForEnum(o => o.ChangeProposalHeader.ChangeProposal.FitType)
            </div>
            <div class="5050SplitRight">
            </div>
        </div></text>);

继承人的代码(我从另一个线程得到了这个)

 public static class HtmlExtensions
{
    public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression
    )
    {
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        var names = Enum.GetNames(metaData.ModelType);
        var sb = new StringBuilder();
        foreach (var name in names)
        {
            var id = string.Format(
                "{0}_{1}_{2}",
                htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
                metaData.PropertyName,
                name
            );

            var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString();
            sb.AppendFormat(
                "<label for=\"{0}\">{1}</label> {2}",
                id,
                HttpUtility.HtmlEncode(name),
                radio
            );
        }
        return MvcHtmlString.Create(sb.ToString());
    }
}

提前致谢。

Ĵ

1 个答案:

答案 0 :(得分:0)

Ok所以我认为RadioBoxForEnum代码一定存在问题,因为我发现了一种不同的方法,使用我找到的以下代码创建了一个编辑器模板,这适用于任何问题。

Enum_radioButtonList.cshtml

@model Enum

@{
 // Looks for a [Display(Name="Some Name")] or a [Display(Name="Some Name", ResourceType=typeof(ResourceFile)] Attribute on your enum
Func<Enum, string> getDescription = en =>
{
    Type type = en.GetType();
    System.Reflection.MemberInfo[] memInfo = type.GetMember(en.ToString());

    if (memInfo != null && memInfo.Length > 0)
    {

        object[] attrs = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute),
                                                        false);

        if (attrs != null && attrs.Length > 0)
            return ((System.ComponentModel.DataAnnotations.DisplayAttribute)attrs[0]).GetName();
    }

    return en.ToString();
};
var listItems = Enum.GetValues(Model.GetType()).OfType<Enum>().Select(e =>
new SelectListItem()
{
    Text = getDescription(e),
    Value = e.ToString(),
    Selected = e.Equals(Model)
});
string prefix = ViewData.TemplateInfo.HtmlFieldPrefix;
int index = 0;
ViewData.TemplateInfo.HtmlFieldPrefix = string.Empty;

foreach (var li in listItems)
{
    string fieldName = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}_{1}", prefix, index++);
    <div class="editor-radio">
    @Html.RadioButton(prefix, li.Value, li.Selected, new { @id = fieldName }) 
    @Html.Label(fieldName, li.Text)    
    </div>
}
ViewData.TemplateInfo.HtmlFieldPrefix = prefix;
}

这被调用如下:

@Html.EditorFor(o => o.ChangeProposalHeader.ChangeProposal.FitType, "Enum_radioButtonList")