如何根据问题类型自定义HTML助手以行动



我做了一个调查应用程序,如以下设计:

Survey: ID,Name.
Question: ID,SurveyId,QuestionText,QuestionTypeId.
QuerstionType can be (Text, CheckBox, DropDown,RadioButton).

在运行时给每个问题一个合适的HTML助手的最佳做法是什么?

目前我正在使用传统语句。

if(QuestionModel.QuestionTypeId==QuestionTypes.Text)
{
   @Html.editor()
}
else if(QuestionModel.QuestionTypeId==QuestionTypes.DropDown)
{
   @Html.DropDownList()
}   
else
{
   ...
}

等等。

我觉得自己做错了什么,有什么方法可以根据问题类型自定义一个HTML助手以不同的方式行事。

,或者如果我可以将HTML助手连接到视图模型,然后在这样的视图中直接使用它:

Model.CustomDropdown.

您可以创建一个自定义的HTML辅助组件:

namespace System.Web.Mvc
{
    public static partial class HtmlHelperExtensions
    {
        public static MvcHtmlString CustomComponent(this HtmlHelper helper, string QuestionTypeId)
        {
            if (QuestionTypeId == "Text")
            {
                var inputTag = new TagBuilder("input");
                inputTag.MergeAttribute("type", "text");
                return MvcHtmlString.Create(inputTag.ToString());
            }
            else if (QuestionTypeId == "DropDown")
            {
                var dropDownTag = new TagBuilder("select");
                dropDownTag.MergeAttribute("type", "text");

                var option = new TagBuilder("option");
                option.InnerHtml = "Option 1";
                option.MergeAttribute("value", "option1");
                dropDownTag.InnerHtml += option.ToString();
                option = new TagBuilder("option");
                option.InnerHtml = "Option 2";
                option.MergeAttribute("value", "option2");
                dropDownTag.InnerHtml += option.ToString();
                return MvcHtmlString.Create(dropDownTag.ToString());
            }
            else
            {
                var inputTag = new TagBuilder("input");
                inputTag.MergeAttribute("type", "checkbox");
                return MvcHtmlString.Create(inputTag.ToString());
            }
        }
     }
}

,在您的剃须刀代码中,您可以像:

一样称呼它
@Html.CustomComponent("Text")
@Html.CustomComponent("DropDown")
@Html.CustomComponent("Check")

在创建组件时,您必须在参数中传递自定义对象,而不是字符串。另外,在打电话时,您必须通过该自定义对象。喜欢:

public static MvcHtmlString CustomComponent(this HtmlHelper helper, QuestionModel questionModel)
        {
            if (questionModel.QuestionTypeId==QuestionTypes.Text)
            {
                var inputTag = new TagBuilder("input");
                inputTag.MergeAttribute("type", "text");
                return MvcHtmlString.Create(inputTag.ToString());
            }
        }

和在您的剃须刀中:

@Html.CustomComponent(questionModelObject)

最新更新