2008-09-25 4 views
35

В моем приложении ASP.net MVC У меня есть мнение, что выглядит следующим образом:формат даты Binding (ASP.NET MVC)

... 
<label>Due Date</label> 
<%=Html.TextBox("due")%> 
... 

Я использую ModelBinder привязать почту к моей модели (имеет свойство DateTime). Проблема заключается в том, что я помещаю «01/01/2009» в текстовое поле, и сообщение не проверяется (из-за неправильного ввода других данных). Связующее повторно заполняет его датой и временем «01/01/2009 00:00:00».

Есть ли способ сообщить связующему правилу правильную форму даты (т. Е. ToShortDateString())?

+0

Я тоже ударил этого вчера. Я бы хотел, чтобы у них была перегрузка, которая позволяла вам передавать строку формата. – 2008-09-25 14:27:10

+0

Я думаю, что решение, предоставляемое здесь чище: http://stackoverflow.com/questions/8089316/input-with-date-format-set-from-viewmodel-and-html-class-attribute – 2012-03-29 09:24:06

ответ

1

Для того, чтобы сильно получить типизированный доступ к вашей модели в коде позади вашего зрения, вы можете сделать это:

public partial class SomethingView : ViewPage<T> 
{ 
} 

где T является типом ViewData, который вы хотите передать в от ваших действий.

Тогда в вашем контроллере вы бы действие:

public ActionResult Something(){ 
    T myObject = new T(); 
    T.Property = DateTime.Today(); 

    Return View("Something", myObject); 
} 

После того, что вы хорошо сильно типизированных данные модели на ваш взгляд, так что вы можете сделать:

<label>My Property</label> 
<%=Html.TextBox(ViewData.Model.Property.ToShortDateString())%> 
+0

Спасибо за ответ. Я знаю строго напечатанные страницы и преимущества, которые они приносят, я считаю, что это более применимо в виде редактирования. Я был специально после информации, которая применима к использованию modelbinder (в представлении создания). – 2008-09-25 15:50:36

0

Я думаю, лично я d сказать, что это лучше всего или проще всего сделать с помощью строго типизированной страницы и определенного класса модели, но если вы хотите, чтобы это было чем-то, что живет в связующем, я бы сделал это следующим образом:

public class SomeTypeBinder : IModelBinder 
{ 
    public object GetValue(ControllerContext controllerContext, string modelName, 
           Type modelType, ModelStateDictionary modelState) 
    { 
     SomeType temp = new SomeType(); 
     //assign values normally 
     //If an error then add formatted date to ViewState 
     controllerContext.Controller.ViewData.Add("FormattedDate", 
           temp.Date.ToShortDateString()); 
    } 
} 

И затем использовать его в представлении при создании текстового поля, т.е.:

<%= Html.TextBox("FormattedDate") %> 

Надежда, что помогает.

4

Почему бы вам не использовать

<% =Html.TextBox("due", Model.due.ToShortDateString()) %> 
+0

Корин хочет ввести дату, а не только показать дату. Эта проблема связана с датой привязки в требуемом формате. – 2009-12-20 10:00:37

4

Я нашел этот вопрос, ища ответ сам. Вышеупомянутые решения не работали для меня, потому что мой DateTime имеет значение NULL. Вот как я решил это с поддержкой обнуляемых объектов DateTime.

<%= Html.TextBox(String.Format("{0:d}", Model.Property)) %> 
+0

Неправильно, ответ @ Quoo отлично работает с нулевым значением DateTime. Просто протестировал его. – andreapier 2012-12-17 10:43:23

+1

Посмотрите на даты, интернет-герой. Его ответ был опубликован через год после моего. – 2012-12-18 16:50:42

1

Я считаю, что лучший способ сделать это, чтобы сбросить ModelValue

ModelState.SetModelValue("due", new ValueProviderResult(
     due.ToShortDateString(), 
     due.ToShortDateString(), 
     null)); 
3

Сначала добавьте это расширение для получения пути собственности:

public static class ExpressionParseHelper 
{ 
    public static string GetPropertyPath<TEntity, TProperty>(Expression<Func<TEntity, TProperty>> property) 
    {      
     Match match = Regex.Match(property.ToString(), @"^[^\.]+\.([^\(\)]+)$"); 
     return match.Groups[1].Value; 
    } 
} 

чем добавить это расширение для HtmlHelper :

public static MvcHtmlString DateBoxFor<TEntity>(
       this HtmlHelper helper, 
       TEntity model, 
       Expression<Func<TEntity, DateTime?>> property, 
       object htmlAttributes) 
      { 
       DateTime? date = property.Compile().Invoke(model); 
       var value = date.HasValue ? date.Value.ToShortDateString() : string.Empty; 
       var name = ExpressionParseHelper.GetPropertyPath(property); 

       return helper.TextBox(name, value, htmlAttributes); 
      } 

Также вы должны добавить этот код jQuery:

$(function() { 
    $("input.datebox").datepicker(); 
}); 

datepicker - это плагин jQuery.

И теперь вы можете использовать его:

<%= Html.DateBoxFor(Model, (x => x.Entity.SomeDate), new { @class = "datebox" }) %> 

ASP.NET MVC2 and DateTime Format

9

Это грязная хак, но это, кажется, работает.

<%= Html.TextBoxFor(model => model.SomeDate, 
    new Dictionary<string, object> { { "Value", Model.SomeDate.ToShortDateString() } })%> 

Вы получаете модель связывания и способны переопределить свойство HTML «значение» текстовое поле с отформатированной строкой.

+7

me likey. короткий и сладкий. вот моя небольшая вариация: <% = Html.TextBoxFor (model => model.SomeDate, new {@Value = Model.SomeDate.ToShortDateString()})%> – 2010-11-12 21:00:51

55

Я просто наткнулся на это очень простое и элегантное решение, доступны в MVC 2:

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

В принципе, если вы используете MVC 2.0, используйте следующее в вашем представлении.

<%=Html.LabelFor(m => m.due) %> 
<%=Html.EditorFor(m => m.due)%> 

затем создать частичный вид в/Views/Shared/EditorTemplates, называется DateTime.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %> 
<%=Html.TextBox("", (Model.HasValue ? Model.Value.ToShortDateString() : string.Empty), new { @class = "datePicker" }) %> 

Когда EditorFor <> называется она найдет соответствующий редактор шаблонов.

24

Украсьте свойство в модели с атрибутом DataType, и указать, что сво Date, а не DateTime:

public class Model { 
    [DataType(DataType.Date)] 
    public DateTime? Due { get; set; } 
} 

Вы должны использовать EditorFor вместо TextBoxFor в представлении, а также:

@Html.EditorFor(m => m.Due) 
0

Это работает для меня: MVC 2

<%: Html.TextBoxFor(m => m.myDate, new { @value = Model.myDate.ToShortDateString()}) %>

Простые и сладкие!

Комментарий пользователя82646, думал, что сделаю его более заметным.

0

Попробуйте

<%:Html.TextBoxFor(m => m.FromDate, new { @Value = (String.Format("{0:dd/MM/yyyy}", Model.FromDate)) }) %> 
0

MVC4 Ef5 View Я пытался поджать поле с текущей датой затем передать его представления для утверждения.

ViewModel.SEnd = DateTime.Now //preload todays date 
return View(ViewModel)   //pass to view 

В представлении мой первый код позволил редактировать:

@Html.EditedFor(item.SEnd)  //allow edit 

Позже я изменил его, чтобы просто отобразить дату, пользователь не может изменить его, но представить запускающее контроллер SaveChanges

<td> 
@Html.DisplyFor(item.SEnd)  //show no edit 
</td> 

Когда я изменился на DisplayFor, мне нужно было добавить это, чтобы гарантировать, что предварительно загруженное значение было передано обратно контроллеру. Мне также нужно добавить HiddenFor для каждого поля в viewmodel.

@Html.HiddenFor(model => model.SEnd)  //preserve value for passback. 

Новички, но это заняло некоторое время, чтобы это исправить.

Смежные вопросы