Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将文本框绑定到datetime字段,但只显示其日期部分(在ASP.MVC中)?_C#_Jquery_Asp.net Mvc_Date_Datetime - Fatal编程技术网

C# 如何将文本框绑定到datetime字段,但只显示其日期部分(在ASP.MVC中)?

C# 如何将文本框绑定到datetime字段,但只显示其日期部分(在ASP.MVC中)?,c#,jquery,asp.net-mvc,date,datetime,C#,Jquery,Asp.net Mvc,Date,Datetime,我有一个文本框绑定到日期时间模型字段的视图 观点: @Html.TextBoxFor(model => model.StartDate, new { @class = "datepicker", id = "startDate" }) 模型: [Required(ErrorMessageResourceType = typeof(Resources.ValidationMessages), ErrorMessageResourceName = "GeneralRequired")] [D

我有一个文本框绑定到日期时间模型字段的视图

观点:

@Html.TextBoxFor(model => model.StartDate, new { @class = "datepicker", id = "startDate" })
模型:

[Required(ErrorMessageResourceType = typeof(Resources.ValidationMessages), ErrorMessageResourceName = "GeneralRequired")]
[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
[DataType(DataType.Date)]
[Display(Name = "StartDate", ResourceType = typeof(Resources.Something))]
public DateTime? StartDate { get; set; }
视图使用jQuery日期选择器处理日期输入。Jquery只生成日期,但据我所知,C#中没有唯一的日期类型

我也使用定制的DateTime模型绑定器,但是发布代码(tl;dr;)太大了

当用户在文本框中输入示例15-01-2015并将其发布到方法时,模型绑定器会正确地将其转换为15-01-2015 12:00。问题是,当表单上有两个datetime字段,并且用户只输入其中一个字段时,激活验证时,操作方法返回带有验证消息的视图。已输入的字段仍应明显填写。问题在于,当控制器的动作方法返回视图时,它会在文本框中放置一个日期时间,而不仅仅是一个日期

是否有任何方法可用于只向视图中的绑定字段传递日期而不是日期和时间?或者可以将字段绑定,但只在文本框中显示value.Date?

@if(model.StartDate.HasValue)
{
   @Html.EditorFor(model => model.StartDate, "TemplateFirst")
}
else
{
   @Html.EditorFor(model => model.StartDate, "TemplateSecond")
}
编辑:

我试图应用雨果·德尔辛的解决方案,但面临下一个问题。基本上,我们将对模型的DateTime字段使用EditorTemplate。DateTime.cshtml如下所示:

@model System.DateTime?
@if (Model == null)
{
    @Html.TextBox(
   string.Empty,
   "",
   new { @class = "datepicker", @type = "text" })
}
else
{
    @Html.TextBox(
   string.Empty,
   Model.ToString("dd-MM-yyyy"),
   new { @class = "datepicker", @type = "text" })
}
据我所知,这个问题出现在队列中

型号.ToString(“dd-MM-yyyy”)

因为抛出的错误是

Shared\EditorTemplates\DateTime.cshtml(13):错误CS1501:无重载 方法“ToString”的参数为1

据我所知,其他人总是被评估的,对吗? 有什么解决方案可以实现我想要的,而不用将if语句移到主视图并构建类似的内容?

@if(model.StartDate.HasValue)
{
   @Html.EditorFor(model => model.StartDate, "TemplateFirst")
}
else
{
   @Html.EditorFor(model => model.StartDate, "TemplateSecond")
}

我使该程序正常工作的唯一方法是创建一个新的
EditorTemplate

~/Views/Shared/EditorTemplates
中创建一个名为
DateTime.cshtml
的视图,并将以下内容放入其中

@model System.DateTime?
@{
    var val = "";
    if (Model != null)
    {
        val = ((DateTime)Model).ToString("dd-MM-yyyy");
    }
}
@Html.TextBox(
   string.Empty, 
   val,
   new { @class="datepicker", @type = "text"})
现在,如果调用默认编辑器模板,它将工作并始终显示日期的
datepicker

<div class="editor-container">
    <div class="editor-label">
        @Html.LabelFor(model => model.StartDate)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.StartDate)
        @Html.ValidationMessageFor(model => model.StartDate)
    </div>
</div>

@LabelFor(model=>model.StartDate)
@EditorFor(model=>model.StartDate)
@Html.ValidationMessageFor(model=>model.StartDate)

正如Stephen Muecke指出的那样,
@type=“text”
并不是真正需要的。这是默认值。您可以将其添加/更改为
date
,以触发HTML5日期选择器。请记住,它可能会在“MM dd yyyy”中显示HTML5日期选择器,然后无法验证该值。

如果您使用的是jQuery日期选择器,则需要在插件代码和
TextBoxFor()
方法中格式化日期

@Html.TextBoxFor(m => m.StartDate, "{0:dd-MM-yyyy}", new { @class = "datepicker" })
剧本呢

$('.datepicker').datepicker({ dateFormat: 'dd-mm-yy' })
旁注:您不需要设置
id
属性(助手为您添加
id=“StartDate”

注意:使用
TextBoxFor()
时,您不需要在属性上使用
[DisplayFormat(DataFormatString=“{0:dd-MM-yyyy}”,ApplyFormatInEditMode=true)]
[DataType(DataType.Date)]
。只有在使用
@Html.EditorFor()
时,才会考虑这些属性,并生成将呈现浏览器HTML5日期选择器的
。在任何情况下,都需要是
DataFormatString=“{0:yyyy-MM-dd}”
(ISO格式)才能正确绑定。请注意,
type=“date”
仅在某些现代浏览器中受支持,而在FireFox中则完全不受支持)

不需要为
DateTime
自定义
EditorTemplate
,但如果要这样做,只需

@model System.DateTime?
@Html.TextBoxFor(m => m.StartDate, "{0:dd-MM-yyyy}", new { @class = "datepicker" })
无需根据接受的答案测试
null
。此解决方案是不灵活的,因为您无法传递html属性(如果不进行一些修改,则将其作为
additionViewData
根据传递)

您还提到使用定制的
ModelBinder
,它太大了,无法发布。不清楚你为什么需要这个。例如,如果将服务器区域性设置为接受该格式,则不需要该格式

<system.web>
  <globalization culture="en-AU" uiCulture="en-AU"/>

但无论如何,它不应该超过几行代码


最后,如果包含
@Html.ValidationMessageFor(m=>m.StartDate)
,则可以使用(globalize.js)或重写
$.validator.methods.date
方法,但由于可以在jQuery日期选择器中设置诸如最小日期和最大日期之类的选项,可能不需要使用
ValidationMessageFor

使用而不是jQuery UI日期选择器插件在jQuery日期选择器脚本中指定了日期格式吗?-你需要显示代码!注意:如果您使用的是
@Html.TextBoxFor()
,则设置
[DisplayFormat(DataFormatString=“{0:dd-MM-yyyy}”,ApplyFormatInEditMode=true)]
没有影响。只有当您使用
@HtmlEditorFor()
呈现浏览器日期选择器时,它才相关。@wizkid这不是我问题的答案。在项目的这个阶段,我不会更改它:)。@StephenMuecke您不正确此属性在TextBoxFor helper中也很重要。我正在使用它,如果没有此属性,model binder无法在模型对象中正确构建DateTime属性。它不能
ApplyFormatInEditMode
仅适用于
EditorFor()
TextBoxFor()
中设置格式的唯一方法是使用接受格式字符串的重载,例如
@Html.TextBoxFor(m=>m.StartDate,{0:dd MM yyyyy}),new{@class=…})
它与使用服务器文化的
DefaultModelBinder
完全无关。也许你应该学习MVC源代码。非常感谢你的回答。这几乎是完美的。缺少的一件事是非常有趣的问题。在开始时,我将空的StartDate传递给编辑器模板,然后我们遇到了问题。此外,如果我在DateTime中将DateTime更改为nullable。