Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何自定义Html帮助程序以根据问题类型进行操作?_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# 如何自定义Html帮助程序以根据问题类型进行操作?

C# 如何自定义Html帮助程序以根据问题类型进行操作?,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我做了一个调查申请,如下设计: Survey: ID,Name. Question: ID,SurveyId,QuestionText,QuestionTypeId. QuerstionType can be (Text, CheckBox, DropDown,RadioButton). 在运行时为每个问题提供合适的Html助手的最佳实践是什么 目前我使用的是传统的if-else语句 if(QuestionModel.QuestionTypeId==QuestionTypes.Text) {

我做了一个调查申请,如下设计:

Survey: ID,Name.
Question: ID,SurveyId,QuestionText,QuestionTypeId.

QuerstionType can be (Text, CheckBox, DropDown,RadioButton).
在运行时为每个问题提供合适的Html助手的最佳实践是什么

目前我使用的是传统的if-else语句

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());
            }
        }
     }
}
在你的Razor代码中,你可以这样称呼它:

@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)