EditorFor(日期):如何显示空文本框?

时间:2010-11-29 12:05:53

标签: asp.net-mvc asp.net-mvc-2

<%: Html.EditorFor(model => model.date)%>

如何在加载时使此代码显示为空文本框? Model.date不可为空,因此始终显示非空值。如何强制它以空值开始?

注意:我不想让它可以为空,因为在实际代码中,它绑定到一个必须具有值的模型属性(BTW,我对该属性有一个Required数据注释)。让它可以为空是没有意义的。以今天的默认日期替换它不是一种选择,因为这种情况下的要点是确保用户不要忘记主动指定日期。

TIA。

5 个答案:

答案 0 :(得分:8)

问题是,如果Model.Date属性不可为空,那么它将始终具有值。在过去,我为DateTime创建了一个编辑器模板(它也使用了jquery日期选择器)。这允许您处理您的空值,您可能希望找到等于DateTime.MinValue的日期。

所以你的编辑器模板看起来像是:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<%=Html.TextBox("", (Model != DateTime.MinValue ? Model : string.Empty)) %>

你不必担心名字的空字符串,因为这实际上只填充了html前缀,这应该足够了。

本文还介绍了如何创建编辑器模板。

http://geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx

我个人认为我的视图模型中的DateTime可以为空,但在我的域模型中没有使用之间的验证

答案 1 :(得分:2)

  1. 在您的模型中创建一个兄弟属性并使用required:

    进行装饰
    $(".upvote-counter")
    
  2. 在您的视图中,将输入替换为:

       $(document).ready(function () {
    
        var $downvoteCount = 0;
        var $upvoteCount = 0;
    
        $(".upvote").click(function () {
            $upvoteCount++;
            $(this).find(".upvote-counter").text(" " + $upvoteCount);
            var $totalVoteCount = $upvoteCount + $downvoteCount;
            var $upvoteProportion = Math.round(($upvoteCount / $totalVoteCount) * 100);
            var $downvoteProportion = Math.round(($downvoteCount / $totalVoteCount) * 100);
            if (($upvoteProportion + $downvoteProportion) > 100) {
                $(this).width(($upvoteProportion - 0.5) + "%");
                $(this).closest('voting-bar-container').find(".downvotes").width(($downvoteProportion - 0.5) + "%");
            } else {
                $(this).width($upvoteProportion + "%");
                $(this).closest('voting-bar-container').width($downvoteProportion + "%");
            }
        });
    
        $(".downvote").click(function () {
            $downvoteCount++;
            $(this).find(".downvote-counter").text(" " + $downvoteCount);
            var $totalVoteCount = $upvoteCount + $downvoteCount;
            var $upvoteProportion = Math.round(($upvoteCount / $totalVoteCount) * 100);
            var $downvoteProportion = Math.round(($downvoteCount / $totalVoteCount) * 100);
            if (($upvoteProportion + $downvoteProportion) > 100) {
                $(this).closest('voting-bar-container').find(".upvotes").width(($upvoteProportion - 0.5) + "%");
                $(this).width(($downvoteProportion - 0.5) + "%");
            } else {
                $(this).closest('voting-bar-container').find(".upvotes").width($upvoteProportion + "%");
                $(this).width($downvoteProportion + "%");
            }
        });
    });
    

答案 2 :(得分:0)

我会将其放入<td><div>,然后使用id属性访问并通过jquery将其清空。

<script type="text/javascript">
$(document).ready(function(){
$("#clearme").html("");
});
</script>

<div id="clearme">
<%: Html.EditorFor(model => model.date)%>
</div>

可能有一种使用内置MVC功能的方法,但我不知道。

Here是一个快速的小提琴,向您展示这个概念,所以如果您愿意,可以随意使用它。

答案 3 :(得分:0)

对Jorge的答案进行了一些更正:

public DateTime DOB { get; set; } 
[Required]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
[DataType(DataType.Date)]
public DateTime? NullableDOB
{
  get => DOB.ToNullable();
  set => DOB = value.DefaultIfNull(); 
}

ToNullible()DefaultIfNull()IsNull()是一个方便的扩展功能:

public static T? ToNullable<T>(this T source) where T : struct
  => source.IsNull(default(T)) ? (T?)null : source;

public static T? ToNullable<T>(this T source, T @default) where T : struct
  => source.IsNull(@default) ? (T?)null : source;

public static T DefaultIfNull<T>(this T? source, T @default) where T : struct
  => source ?? @default;

public static T DefaultIfNull<T>(this T? source) where T : struct
  => DefaultIfNull(source, default(T));


public static bool IsNull<T>(this T source) where T : struct
  => source.Equals(default(T));

答案 4 :(得分:-1)

您可以使用小型jquery函数。

我这样解决了我的问题:

        @if(Model.HolidayDate <= DateTime.MinValue)
        {
            @Html.TextBoxFor(model => model.HolidayDate, new { @class = "datepick", @style = "width: 75px;", @id="dataInput"})
        }
        else
        {
            @Html.TextBoxFor(model => model.HolidayDate, new { @class = "datepick", @style = "width: 75px;"})
        }

并在页面的末尾:

         $(function(){           $( '#DataInput中的')VAL( '')。       });