Как работает NerdDinner AddModelErrors? - PullRequest
4 голосов
/ 30 июня 2009

Я прохожу бесплатное руководство NerDinner http://nerddinnerbook.s3.amazonaws.com/Intro.htm

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

catch
{
    ModelState.AddModelErrors(dinner.GetRuleViolations());
    return View(new DinnerFormViewModel(dinner));
}

А затем это как определение метода расширения.

namespace NerdDinner.Helpers {

    public static class ModelStateHelpers {

        public static void AddModelErrors(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors) {

            foreach (RuleViolation issue in errors) {
                modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
            }
        }
    }
}

Я стараюсь следовать тому, что говорится в руководстве, в сочетании с тем, что содержится в коде, но получаю ожидаемую ошибку, что нет AddModelErrors метода, который принимает только 1 аргумент.

Я явно упускаю что-то очень важное здесь. Что это?

Ответы [ 2 ]

11 голосов
/ 30 июня 2009

Вы должны включить справку о помощниках;

using NerdDinner.Helpers;

и

using NerdDinner.Models;

Затем проверьте правильность и добавьте ошибки;

if (!dinner.IsValid)
{
    ModelState.AddModelErrors(dinner.GetRuleViolations());
    return View(dinner);
}

Вы также должны иметь частичное занятие на ужин;

public partial class Dinner
{
    public bool IsValid
    {
        get { return (GetRuleViolations().Count() == 0); }
    }

    public IEnumerable<RuleViolation> GetRuleViolations()
    {
        if (String.IsNullOrEmpty( SomeField ))
            yield return new RuleViolation("Field value text is required", "SomeField");
    }

    partial void OnValidate(ChangeAction action)
    {
        if (!IsValid)
            throw new ApplicationException("Rule violations prevent saving");
    }
}

Не забудьте класс RuleViolation;

public class RuleViolation
{
    public string ErrorMessage { get; private set; }
    public string PropertyName { get; private set; }

    public RuleViolation(string errorMessage)
    {
        ErrorMessage = errorMessage;
    }

    public RuleViolation(string errorMessage, string propertyName)
    {
        ErrorMessage = errorMessage;
        PropertyName = propertyName;
    }
}
3 голосов
/ 22 октября 2009

Если вы получаете то же сообщение об ошибке, что и этот постер:

"System.Web.Mvc.ModelStateDictionary" не содержит определения для "AddModelErrors", и нет метода расширения "AddModelErrors", принимающего первый аргумент типа "System.Web.Mvc.ModelStateDictionary" (вы отсутствует директива using или ссылка на сборку?) "

Возможно, у вас возникла эта проблема:

http://p2p.wrox.com/book-professional-asp-net-mvc-1-0-isbn-978-0-470-38461-9/74321-addmodalerrors-allcountries-page-87-view-data-dictionary.html#post248356

...