Почему мой частичный просмотр подтверждается при загрузке страницы? - PullRequest
2 голосов
/ 24 декабря 2011

Я использую asp.net MVC3 и проверку на стороне клиента, чтобы помочь проверить мою форму. Это прекрасно работает, но я столкнулся с необычной ситуацией. Часть моей формы (2 входа, если быть точным) загружается из частичного представления. Эти поля имеют свои собственные правила проверки (например, «обязательные») и работают, как ожидается. Ну, почти. Странно то, что правила запускаются, как только «запрашивается» частичное представление при загрузке страницы. Так что у меня будет около 20 полей формы или около того; с 2 из которых (из частичного представления) с указанием «Это поле обязательно для заполнения».

Вот моя родительская страница, вызывающая частичное представление:

@Html.Action("Index", "Foo", @Model.Foo)

Установка свойства в модели моего частичного вида:

[Required(ErrorMessage = "This is required.")]
public string foo { get; set; }

Отображение входных данных и проверка в моем частичном представлении:

@Html.LabelFor(m => m.test, "Test")
@Html.TextBoxFor(m => m.test)
@Html.ValidationMessageFor(m => m.test)

Вызов частичного представления из своего контроллера:

public ActionResult Index(Foo myModel)
{
    return PartialView("_PartialView", myModel);
}

Кто-нибудь знает, что может быть причиной этого? Если нет, есть ли способы отладки этой проверки, чтобы выяснить, что происходит?

1 Ответ

4 голосов
/ 24 декабря 2011

Причина, по которой это происходит, заключается в том, что, когда механизм связывания модели по умолчанию пытается проанализировать аргумент myModel действия Index из значений запроса, он автоматически добавляет ошибки в ModelState.И я подозреваю, что Model.Foo, который вы передаете, недействителен.

Одна возможность - очистить состояние модели, если вы хотите:

public ActionResult Index(Foo myModel)
{
    ModelState.Clear();
    return PartialView("_PartialView", myModel);
}

Другая возможность - передать действительный экземпляр Foo (т. Е. Свойство test должно иметьзначение).На самом деле, если вы не хотите передавать какие-либо значения, вам действительно не нужен этот аргумент действия, и у вас может быть действие, подобное следующему:

public ActionResult Index()
{
    var myModel = new Foo();
    return PartialView("_PartialView", myModel);
}

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

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