我试图在我的MVC5应用程序中构建可重用的日期时间控件。 实现代码的最佳方式是什么:
<div class="col-xs-12 col-lg-12"> <!-- class(es) passed via htmlAttributes -->
<div class="input-group">
<div class="input-group-addon"><span class="icon glyphicon glyphicon-calendar"></span></div>
<input class="form-control" id="StartDate" name="StartDate" type="text"/>
</div>
<div class="input-group">
<div class="input-group-addon"><span class="icon glyphicon glyphicon-time"></span></div>
<input class="form-control" id="StartTime" name="StartTime" type="text"/>
</div>
<div style="opacity: 0; height: 0;">
@Html.TextBoxFor(m => m.TheDateTime)
<input id="Start" name="Start" type="text" />
</div>
</div>
我希望在我的观看中使用像@Html.DateTimePickerFor(m => m.Start, true, new object[]{})
这样的东西,其中第二个参数是bool renderTimePicker
。
创建一个使用TagBuilder
构建标记的帮助方法对我来说似乎很奇怪。这也意味着,如果我进行更改,我必须释放应用程序。
我不知道如何将标记保存为&#34; plain&#34; (cs)html并像上面提到的那样使用它。
我已经
了public static MvcHtmlString<TModel, TProperty>(this HtmlHelper helper, Expression<Func<TModel, TProperty>> expression, bool? renderTimePicker = false, object htmlAttributes = null)
{
return helper.EditorFor(expression, "DateTimePickerMarkup", ???); // how to pass renderTimePicker and htmlAttributes
}
但我被困在这里,因为我不知道如何通过我的额外参数。
由于数据将被发布并且可能是列表的一部分,因此名称/ ID也可能类似于Model.AwesomeList[0].SomeDate
,这对我来说更加困难。
编辑#1
我目前有这个
public static MvcHtmlString DateTimePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime>> expression, bool? renderTimePicker = false, object htmlAttributes = null)
{
var viewModel = new DateTimePickerViewModel
{
HtmlAttributes = htmlAttributes,
TheDateTime = expression.Compile()(helper.ViewData.Model), // this gets me the current value
RenderTimePicker = renderTimePicker ?? false
};
return helper.HtmlInternal.Partial("~/Views/Shared/EditorTemplates/_DateTimePicker.cshtml", viewModel);
}
而_DateTimePicker.cshtml
如上所示并按预期呈现。
我的新问题是,我的source-property用Attributes
修饰以进行验证。
如果我使用@Html.TextBoxFor(m => m.TheDateTime)
,则会生成一个简单的TextBox
而没有所需的数据属性进行验证,因为TheDateTime
没有。
如何将源属性Start
传递给_DateTimePicker.cshtml
,以便Html.TextBoxFor()
也会呈现验证属性?