Почему мой частичный просмотр проверяется при загрузке страницы?

Я использую 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);
}

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


person Jonathan    schedule 24.12.2011    source источник
comment
Спасибо за подсказку @ashkan-mobayen-khiabani, я обновил свой пост тем, что считаю соответствующим кодом.   -  person Jonathan    schedule 24.12.2011


Ответы (1)


Это происходит потому, что, когда связыватель модели по умолчанию пытается проанализировать аргумент 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);
}

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

person Darin Dimitrov    schedule 24.12.2011
comment
Большое спасибо @darin-dimitrov, вы спасли меня от многих часов разочарования. Мне нужно передать существующую модель, поэтому первое решение отлично сработало для меня. - person Jonathan; 24.12.2011