Сбой приложения из-за проверки - «Это свойство не может иметь нулевое значение» - PullRequest
0 голосов
/ 14 января 2012

Я создал следующее представление для пользователей, чтобы создавать новые элементы.Я попытался создать немного проверки, поэтому, если пользователь оставляет поле пустым, он выдает сообщение проверки.Однако, если пользователь оставляет поле пустым, мое приложение вылетает в следующей строке: _headline = structuralObject.SetValidValue(value, false) в файле Model.Designer.cs.потому что:

Это свойство не может иметь нулевое значение.

Часть моего файла Model.Designer.cs:

[EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.String headline
    {
        get
        {
            return _headline;
        }
        set
        {
            OnheadlineChanging(value);
            ReportPropertyChanging("headline");
      _headline = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("headline");
            OnheadlineChanged();
        }
    }

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

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>

    <legend>News Details</legend>

    <br />
        Posted Date:
            <div class="editor-field">
                @Html.EditorFor(model => model.posted)
                @Html.ValidationMessageFor(model => model.posted)
            </div>

    <br />

        Headline Title:
            <div class="editor-field">
                @Html.EditorFor(model => model.headline)
                @Html.ValidationMessageFor(model => model.headline)
            </div>

    <br />

Ниже приведен файл AccountModels.cs, в который я ввел проверку для представления:

[MetadataType(typeof(NewsValidation))]

public partial class News
{
}

public class NewsValidation
{

   [Required(ErrorMessage = "Posted date is required")]
    public DateTime posted { get; set; }

    [Required(ErrorMessage = "Headline is required")]
    [Display(Name = "Headline")]
    public string headline { get; set; }

    [Required(ErrorMessage = "Story body is required")]
   public string story { get; set; }
}

IМне сказали, что это потому, что моя база данных допускает значения Null, однако с тех пор я создал новую базу данных, которая больше не допускает значения Null.Мое приложение все еще падает, и я не знаю, с чего начать.Вот странная вещь, когда он падает, я нажимаю кнопку воспроизведения, чтобы продолжить, и появляется проверка.Таким образом, похоже, что проверка работает, но по какой-то причине заранее происходит сбой приложения.

Кто-нибудь может предложить какую-либо поддержку?

Ответы [ 2 ]

0 голосов
/ 14 января 2012

Проблема в том, что установщик свойства headline в модели вашего домена пытается выполнить обновление.Этот установщик вызывается механизмом связывания модели по умолчанию, когда он пытается связать аргумент действия из запроса.И если пользователь оставит поле заголовков пустым, вы получите это исключение.

Я очень настоятельно рекомендую вам использовать модели представления и никогда не передавать модели вашего домена в представление.Итак, определите простую NewsViewModel:

public class NewsViewModel
{
    public DateTime Posted { get; set; }

    [Required]
    public string Headline { get; set; }
}

, а затем попросите действие контроллера передать его представлению:

public class HeadlinesController: Controller
{
    public ActionResult Index()
    {
        var model = new NewsViewModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(NewsViewModel model)
    {
        if (!ModelState.IsValid)
        {
            // there were validation errors. For example the user
            // left the headline field blank => redisplay the view
            return View(model);
        }

        // at this stage we know that validation passed => we can 
        // process our domain model.
        var news = new News();
        news.posted = model.Posted;
        news.headline = model.Headline;

        return RedirectToAction("success");
    }
}

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

@model NewsViewModel
@using (Html.BeginForm()) 
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>News Details</legend>

        <br />
        Posted Date:
        <div class="editor-field">
            @Html.EditorFor(model => model.Posted)
            @Html.ValidationMessageFor(model => model.Posted)
        </div>

        <br />

        Headline Title:
        <div class="editor-field">
            @Html.EditorFor(model => model.Headline)
            @Html.ValidationMessageFor(model => model.Headline)
        </div>

        <br />

        <button type="submit">OK</submit>
    </fieldset>
}
0 голосов
/ 14 января 2012

Если приложение дает сбой, но вы можете нажать кнопку воспроизведения, и оно успешно продолжает и выполняет проверку, настроен ли ваш отладочный режим для отображения всех сгенерированных исключений, а не только необработанных пользователем? Возможно, StructuralObject.SetValidValue() использует исключение для управления потоком.

  1. Перейти к отладке> Исключения
  2. Если у вас нет столбца «Необработанный пользователем», перейдите в «Инструменты»> «Параметры»> «Отладка»> «Общие» и установите флажок «Включить только мой код (только для управления)»
  3. В разделе «Отладка> Исключения» снимите флажок «Брошено» и установите флажок «Необработанный пользователь» в разделе Исключения общего времени выполнения

Просто догадка - это что-то меняет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...