我做了一个调查应用程序,如以下设计:
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)