#c# #asp.net-mvc
#c# #asp.net-mvc
Вопрос:
В настоящее время я пытаюсь узнать что-то о MVC, создав небольшой проект. Мне уже удалось заставить работать много вещей, но теперь я сталкиваюсь с чем-то, что я не могу объяснить.
В принципе, у меня обычная настройка (модель, просмотрщик, контроллер), и моя база данных модели отображается в представлении. Начиная со стандартного Create-View and -Action, который может быть сгенерирован автоматически в Visual Studio, я намеревался изменить этот метод, чтобы некоторые ячейки имели вычисленные значения и не поступали из пользовательского ввода.
Это отлично работает для моего столбца Ready-column и столбца Ready-Date, но не работает для столбца Month. Чтобы как-то сгенерировать новую строку
@Html.EditorFor(модель => модель.Месяц)
требуется. Если я удалю это (как я сделал для Ready и Ready-Date), нажатие кнопки отправки ничего не создаст, и приложение останется на странице создания.
Мои два ActionResults в ModelController выглядят так:
public ActionResult Create()
{
//I use this in order to print the UpcomingMonth on the Create-Page
ViewBag.upcomingMonth = getUpcomingMonth();
return View();
}
public ActionResult Create([Bind(Include = "Report_ID,Month,Ready,Ready_Date")] Report report)
{
if (ModelState.IsValid)
{
//I would like to use this calculation for the Month-Value
report.Month = getUpcomingMonth();
//For Ready and Ready_Date it works to set the values here before adding to the db
report.Ready = true;
report.Ready_Date = System.DateTime.Now;
db.Reports.Add(report);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(report);
}
И соответствующая часть моего представления:
<p style="float:right">
@*Button to create new month*@
@Html.ActionLink("Create", "Create")
</p>
<h2>Latest</h2>
<table class="table">
<thead>
<tr>
@*Column-header: Month*@
<th style="width: 10%; text-align:center">
@Html.DisplayNameFor(model => model.Month)
</th>
@*Column-header: True/False is ready*@
<th style="width: 10%; text-align:center">
@Html.DisplayNameFor(model => model.Ready)
</th>
@*Column-header: Set ready Date*@
<th style="width: 20%; text-align:center">
@Html.DisplayNameFor(model => model.Ready_Date)
</th>
</tr>
</thead>
<tbody>
<tr>
@*Cell: Latest Month*@
<td style="width: 10%; text-align:center">
@Html.DisplayFor(modelItem => Model.ElementAt(0).Month)
</td>
@*Cell: Latest True/False is ready
<td style="width: 10%; text-align:center">
...
</td>
@*Cell: Latest Set ready Date*@
<td style="width: 20%; text-align:center">
@Html.DisplayFor(modelItem => Model.ElementAt(0).Ready_Date)
</td>
</tr>
</tbody>
</table>
Я действительно был бы признателен за любую помощь!
PS: С помощью ValidationSummary я получаю следующее (без сообщения об ошибке):
Комментарии:
1. Не могли бы вы опубликовать свой код в View, мой друг?
2. Пожалуйста, добавьте свой код представления, чтобы мы могли видеть, что там происходит. Кроме того, когда вы нажимаете на кнопку отправки, видите ли вы, что запрос выполняется на вкладке Сеть инструментов разработчика вашего браузера?
3. 99,9% то
ModelState.IsValid
естьfalse
4. Добавил свой взгляд. @CamiloTerevinto Да, я вижу, что запрос выполняется.
5. Взгляните на использование
Html.ValidationMessageFor()
и / илиHtml.ValidationSummary()
на ваш взгляд. Оба они используются для отображения ошибок проверки модели пользователю. Вы все еще можете проверить modelstate в контроллере с помощью отладчика, но это может быть более удобно.
Ответ №1:
Я думаю, что ваша модель представления не проверяется. Вы можете увидеть, в чем ошибка, если вы добавите эти строки для просмотра.
@Html.ValidationSummary(true, "Errors:", new { @class = "text-danger bg-danger" })
Комментарии:
1. Я добавил вывод ошибки. К сожалению, он пуст.
Ответ №2:
Я, наконец, узнал, что вызвало такое поведение.
При настройке моей модели я определил требование проверки, которое не допускало пустой строки. Поскольку я установил свои данные после проверки ModelState.IsValid
, пустая строка не прошла эту проверку, и поэтому строка не была добавлена.
Я решил это, удалив требования к проверке месяца.