将可重用的MVC-Control构建为剃刀模板

时间:2016-02-15 07:36:11

标签: c# asp.net-mvc razor reusability

我试图在我的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()也会呈现验证属性?

0 个答案:

没有答案