2010-11-29 2 views
5
<%: Html.EditorFor(model => model.date)%> 

Как я могу заставить этот код отображать пустое текстовое поле при загрузке? Model.date не имеет значения NULL, поэтому всегда отображается непустое значение. Как я могу заставить его начать с пустого значения?EditorFor (date): Как отобразить пустое текстовое поле?

Примечание: я не хочу, чтобы оно было равно нулю, потому что в реальном коде оно привязано к свойству модели, которое должно иметь значение (BTW, у меня есть аннотация для данных Required для этого свойства). Не имеет смысла сделать его нулевым. Замена его на дату по умолчанию, такую ​​как сегодняшняя, не является вариантом ни потому, что в этом случае необходимо убедиться, что пользователь не забыл активно указать дату.

TIA.

ответ

8

Проблема в том, что свойство Model.Date не имеет значения NULL, тогда оно всегда будет иметь значение. Раньше я создал шаблон редактора для DateTime (который также использует jquery date picker). Это позволяет вам обрабатывать пустое значение, для которого вы, вероятно, будете искать дату, равную 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 с моей точки зрения модели Nullable, но не на моей модели предметной области с использованием проверки в между

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 является быстрой скрипкой, которая показывает вам концепцию, поэтому вы можете поиграть с ней, если хотите.

+0

Джон, спасибо за Ваш ответ. Тем не менее, слишком далеко от принципа «разделения проблем». – 2010-11-29 14:16:09

+0

Я не уверен, что это так, но я тоже не знаю ваше приложение! Я рассматриваю это как проблему пользовательского интерфейса, вы хотите, чтобы определенное поле пользовательского интерфейса было пустым, а не заполнено при загрузке. Это может быть выполнено на стороне сервера, будь то доступ к данным или бизнес-логика (мне нравятся идеи модели представления) или уровень представления клиента (используя вышеуказанный jquery). Что касается SoC, вы не завершаете какую-либо логику доступа к бизнесу или доступу к данным в своем слое презентации, просто изменяя способ отображения поля, хорошо вписываясь в уровень представления imo. Но это моя интерпретация, а не ваша =) – JonVD 2010-11-29 23:10:56

+0

моя промежуточная точка заключается в том, что вы добавляете идентификатор div и некоторый код на стороне клиента для исправления проблемы на стороне сервера. – 2010-12-01 16:26:17

-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;"}) 
     } 

и в конце страницы:

$ (функция() { $ ('# DataInput') ,Val (''); });
2
  1. В модели создать свойство родственного и украсить его необходимо:

    [Required] 
    DateTime? CustomDate { 
        get { return date==default(DateTime)?null:date; } 
        set { date = value; } 
    } 
    
  2. На ваш взгляд заменить вход с:

    <%:Html.EditorFor(model => model.CustomDate)%> 
    
0

Некоторые поправки к Ответ Хорхе:

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)); 
Смежные вопросы