Как настроить Html Helper, чтобы действовать в соответствии с типом вопроса? - PullRequest
1 голос
/ 05 июля 2019

Я создал приложение для опроса, как показано ниже:

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

QuerstionType can be (Text, CheckBox, DropDown,RadioButton).

Как лучше всего дать каждому вопросу подходящий Html Helper во время выполнения.

В настоящее время я использую традиционный, еслиоператоры else.

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

и т. д.

Мне кажется, что я что-то не так делаю, есть ли способ настроить один помощник html так, чтобы он действовал по-другому в зависимости от типа вопроса.

Или, если я могу присоединить помощник html к модели представления и использовать его непосредственно в представлении, например, так:

Model.CustomDropdown.

1 Ответ

0 голосов
/ 10 июля 2019

Вы можете создать пользовательский компонент Html Helper, например:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...