.cshtml
код:
@model Tuple<CI_platform.Entities.ViewModels.SheetViewModel, List<CI_platform.Entities.ViewModels.SheetViewModel>, List<CI_platform.Entities.ViewModels.SheetViewModel>>
Это модели просмотра, которые я хочу в этом .cshtml
.
Это моя форма в .cshtml
:
<form method = "post" asp-action = "sheetdatabase" asp-controller = "TimeSheet">
<div class = "modal-body">
<div class = "d-flex flex-column">
<label for = "mission">Mission</label>
<select id = "mission" asp-for = "@Model.Item1.MissionId">
<option>Select Mission</option>
</select>
</div>
<div class = "d-flex flex-column mt-2">
<label for = "date">Date Volunteered</label>
<input type = "date" placeholder = "select date" id = "date" asp-for = "@Model.Item1.DateVolunteered" />
</div>
<div class = "d-flex mt-2 justify-content-between">
<div class = "d-flex flex-column">
<label for = "hour">Hours</label>
<input type = "number" id = "hour" asp-for = "@Model.Item1.hour" />
</div>
<div class = "d-flex flex-column mt-2">
<label for = "minute">Minutes</label>
<input type = "number" id = "minute" asp-for = "@Model.Item1.minute" />
</div>
</div>
<div class = "d-flex flex-column">
<label for = "message">Message</label>
<textarea id = "message" placeholder = "Enter your message" asp-for = "@Model.Item1.Notes"></textarea>
</div>
</div>
<div class = "modal-footer">
<button type = "button" class = "btn btn-secondary" data-bs-dismiss = "modal">Close</button>
<button type = "submit" class = "btn btn-primary" id = "sendmail">Submit</button>
</div>
</form>
Это действие, которому я передаю это значение:
public IActionResult sheetdatabase(SheetViewModel model)
{
if (!ModelState.IsValid)
{
foreach (var error in ModelState.Values.SelectMany(v => v.Errors))
{
Console.WriteLine(error.ErrorMessage);
}
}
var user_id = long.Parse(HttpContext.Session.GetString("userid"));
_timesheetRepository.sheetdatabase(model, user_id);
return View("volunteersheet");
}
Здесь, когда я отправляю форму, в контроллере объект всегда имеет значение null, даже если я заполняю значения во входных и других тегах, это метод публикации.
Это мой метод получения для volunteersheet.cshtml
:
public IActionResult volunteersheet()
{
var (entity1,entity2) = _timesheetRepository.getdatasheet();
var model1 = new SheetViewModel();
var tuple = new Tuple<SheetViewModel, List<SheetViewModel>, List<SheetViewModel>>(model1, entity1, entity2);
return View(tuple);
}
Здесь я передаю один экземпляр двух списков, эти два списка предназначены для извлечения данных из базы данных и показа их для просмотра:
public class SheetViewModel
{
public long UserId { get; set; }
public long MissionId { get; set; }
public string missiontitle { get; set; }
public long hour { get; set; } = new long();
public long minute { get; set; } = new long();
public TimeSpan Time { get; set; }
public int Action { get; set; } = new int();
public DateTime? DateVolunteered { get; set; }
public string Notes { get; set; }
}
Это моя модель.
Этот код правильно извлекает базу данных формы значений, а также отображается в поле зрения, но всякий раз, когда я отправляю форму, действие модели в базе данных листа всегда равно нулю - пожалуйста, помогите мне с этим.
@model Tuple<CI_platform.Entities.ViewModels.SheetViewModel, List<CI_platform.Entities.ViewModels.SheetViewModel>, List<CI_platform.Entities.ViewModels.SheetViewModel>>
Это, кажется, источник проблемы, asp-for = "@Model.Item1.{PropName}"
будет публиковать данные с Item1.{PropName}
, в то время как привязка модели ожидает только {PropName}
. Вам нужно либо имитировать структуру модели в принимающем действии, либо использовать настраиваемую привязку. Попробуйте одно из следующих действий:
public IActionResult sheetdatabase([Bind(Prefix = "Item1")] SheetViewModel model)
Читать далее:
ViewData
, либо объединил элементы кортежа в модель, возможно, исключив некоторые вещи через BindNeverAttribute@ GALAXYA50, тогда попробуйте другие подходы.
Модель Tuple<SheetViewModel> выдает ошибку, что не может создать экземпляр кортежа