【问题标题】:Specify explicitly the model data type MVC/C#明确指定模型数据类型 MVC/C#
【发布时间】:2016-04-15 10:42:33
【问题描述】:

由于@Html.EditorFor() 正在根据模型数据类型构建输入字段。我想使用此方法并为 DATETIME 类型的模型变量生成一个文本框,而不是日历。有没有办法做到这一点?

【问题讨论】:

  • TextBoxFor[DataType(DataType.Text)],AFAIK。真正的问题是为什么要像编辑文本一样编辑 DateTime。
  • @CodeCaster [DataType(DataType.Text)] 不起作用,TextBoxFor 我知道它会生成一个文本框,但重点是你可以使用 FormEditorFor 并为 DateTime var 获取一个文本框。跨度>
  • @CodeCaster 我需要将其解析为 DateTime 格式的 sql。
  • 什么是FormEditorFor()?这不是 MVC 的一部分(或者你的意思是 EditorFor()
  • @StephenMuecke 是的,这就是我的意思,为任何混淆道歉。

标签: c# asp.net-mvc datetime


【解决方案1】:

您可以创建自己的助手来显示和管理日期。

public static MvcHtmlString DatePickerFor<TModel, TProperty>
(this HtmlHelper<TModel> helper, 
Expression<Func<TModel, TProperty>> expression)
{
    string datePickerName = 
          ExpressionHelper.GetExpressionText(expression);
    string datePickerFullName = helper.ViewContext.ViewData.
                   TemplateInfo.GetFullHtmlFieldName
                   (datePickerName);
    string datePickerID = TagBuilder.CreateSanitizedId
                          (datePickerFullName);

    ModelMetadata metadata = ModelMetadata.FromLambdaExpression
                             (expression, helper.ViewData);
    DateTime datePickerValue = (metadata.Model == null ? 
                             DateTime.Now : DateTime.Parse(
                             metadata.Model.ToString()));

    TagBuilder tag = new TagBuilder("input");
    tag.Attributes.Add("name", datePickerFullName);
    tag.Attributes.Add("id", datePickerID);
    tag.Attributes.Add("type", "date");
    tag.Attributes.Add("value", datePickerValue.
                                ToString("yyyy-MM-dd"));

    IDictionary<string, object> validationAttributes = helper.
    GetUnobtrusiveValidationAttributes
    (datePickerFullName, metadata);

    foreach (string key in validationAttributes.Keys)
    {
        tag.Attributes.Add(key, validationAttributes[key].ToString());
    }

    MvcHtmlString html=new MvcHtmlString(
               tag.ToString(TagRenderMode.SelfClosing));
    return html;
}

准备使用助手

public class EmployeeMetadata
{
    [Required]
    public DateTime BirthDate { get; set; }
}

[MetadataType(typeof(EmployeeMetadata))]
public partial class Employee
{
}

    public ActionResult Index()
    {
        NorthwindEntities db = new NorthwindEntities();
        return View(db.Employees.First());
    }

你可以使用你的助手

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
@using(Html.BeginForm("ProcessForm","Home",FormMethod.Post))
    {        
        @Html.DatePicker("birthdateUnbound")
        @Html.DatePickerFor(m=>m.BirthDate)
        @Html.ValidationMessageFor(m=>m.BirthDate)
        <input type="submit" value="Submit" />
    }

提交表单

public ActionResult ProcessForm(Employee obj)
{
    return View("Index",obj);
}

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多