2013-12-12 2 views
0

У меня есть эта модель:ModelState.IsValid = ложь с помощью Jquery DatePicker

[MetadataType(typeof(MovieMetadata))] 
public partial class Movie 
{ 

} 

class MovieMetadata 
{ 
    [ScaffoldColumn(false)] 
    public int id { get; set; } 

    [Required(ErrorMessage = "Title is required")] 
    public string title { get; set; } 

    [Required] 
    public DateTime releaseDate { get; set; } 

    public string storyline { get; set; } 

    public Binary poster { get; set; } 

    [ScaffoldColumn(false)] 
    public DateTime? duration { get; set; } 

    [ScaffoldColumn(false)] 
    public Binary trailer { get; set; } 
} 

это код контроллера:

[HttpPost] 
    public ActionResult Create([Bind(Exclude = "poster, trailer")]Movie movie, HttpPostedFileBase poster, HttpPostedFileBase trailer) 
    { 
     if (ModelState.IsValid) 
     { 
      //saving the movie 
      OperationStatus opStatus = Repository.Save(movie); 

      if (!opStatus.Status) 
      { 
       return View("Error"); 
      } 
     } 

     return View(movie); 
    } 

Это Вид:

@model MoviesModel.Movie 

@{ 
    ViewBag.Title = "Create"; 
    Layout = "~/Views/Shared/MoviesLayout.cshtml"; 
} 

    @section createMovie{ 
    @using (Html.BeginForm(null, null, FormMethod.Post, new { id = "createForm", enctype = "multipart/form-data" })) 
    { 
     @Html.AntiForgeryToken() 
     @Html.ValidationSummary(true) 

     <div class="gallMemberBox"> 

      <div class="leftFormContent"> 
       <a href="#">Movie Name</a> 

       <div class="imgTmpl"> 
        <!--solo hay que especificar el src de la imagen--> 
        <img src="../../Content/img/imgTest.jpg" alt="" /> 
       </div> 
      </div> 

      <div class="rightFormContent"> 

       <div> 
        @Html.LabelFor(model => model.title) 

        @Html.EditorFor(model => model.title) 
        @Html.ValidationMessageFor(model => model.title) 
       </div> 

       <div> 
        @Html.LabelFor(model => model.releaseDate) 

        @Html.EditorFor(model => model.releaseDate) 
        @Html.ValidationMessageFor(model => model.releaseDate) 
       </div> 

       <input type="submit" value="Create" /> 

      </div> 

      <div class="clearBoth"></div> 
     </div> 
    } 
} 

Это шаблон из Views \ Shared \ EditorTemplates \ DateTime.cshtml

@Styles.Render("~/Content/themes/base/jquery-ui.css") 

@Scripts.Render("~/Scripts/jquery-ui-1.8.24.js") 

<script> 
     $(function() { 
      $("#datepicker").datepicker(); 
     }); 
</script> 

@Html.TextBox("datepicker", null, new{id="datepicker"}) 

Когда я выбрать дату и отправить форму, то ModelState ложно, и ReleaseDate приходит с ошибкой:

enter image description here

ответ

1

Если вы хотите использовать шаблон редактора, изменить его на что-то вроде этого:

@model DateTime? 

@Styles.Render("~/Content/themes/base/jquery-ui.css") 

@Scripts.Render("~/Scripts/jquery-ui-1.8.24.js") 

@Html.TextBoxFor(m => m, new{@class="datepicker"}) 

<script> 
     $(function() { 
      $(".datepicker").datepicker(); 
     }); 
</script> 

Использование TextBoxFor будет телеграфировать модель правильно привязки.

Кроме того, я бы рекомендовал переместить Styles.Render() и Scripts.Render() на ваш _Layout, если это возможно. Поскольку я изменил datepicker(), чтобы подключить класс, вы также можете переместить его, если хотите.

+0

Я попытался это сделать, и я получил это исключение, когда я выполнял визуализацию своего представления. Элемент модели, переданный в словарь, имеет значение null, но для этого словаря требуется элемент с ненулевой моделью типа «System.DateTime». В представлении есть эта строка @ Html.EditorFor (model => model.releaseDate), и я поместил в свою папку EditorTemplates код выше – Zinov

+0

Измените '@model DateTime' на' @model DateTime? '. Я также обновляю оригинальный ответ. –

+0

Можете ли вы объяснить мне, почему mvc нужно поместить значение null в элемент модели, переданный в словарь, который будет отображаться в представлении? – Zinov

0

Вместо того, чтобы создать отдельный Textbox с идентификатором DatePicker, просто использовать другой EditorFor для свойства и добавить класс HTML к объекту datepicker и использовать его вместо этого.

EDIT

Это было бы синтаксис, чтобы установить его. (В вашем разделе "Вид" из приведенного выше кода)

@Html.LabelFor(model => model.releaseDate, new { @class = "datepicker" }) 

Тогда ваш Javascript изменится на:

$(document).ready(function() { 
    $('.datepicker').datepicker(); 
}); 
1

Я считаю, что проблема с этой линии:

@Html.TextBox("datepicker", null, new{id="datepicker"}) 

Здесь , вы создаете текстовое поле с именем и идентификатором «datepicker». Поэтому, когда вы отправляете форму, MVC попытается найти свойство в фильме под названием «datepicker», поэтому releaseDate пуст.

Я не думаю, что есть необходимость в шаблоне редактора, вы можете просто использовать рекомендацию @ krillgar.

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

How to get model's field name in custom editor template

+0

Я положил эту строку, и это не сработает: @ Html.TextBox ("releaseDate", null, new {id = "datepicker"}) – Zinov

+0

Можете ли вы использовать Инструменты разработчика в своем браузере и перейти в Сеть, чтобы вы могли узнать, что отправляется на сервер при отправке формы? –

0

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

@Html.TextBox("releaseDate", Model.releaseDate.ToString("MM/dd/yyyy"), new {id="datepicker" }) 

Запомните также, что позже будут добавлены ваши комментарии JQuery, а затем блок сценария.

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