Я довольно новичок в ASP. NET Ядро, и я изучал веревки в течение последних нескольких недель. У меня есть общий вопрос о том, как вы можете поддерживать состояние вашей модели между корректировкой ее в представлении, отправкой ее на сервер, серверной частью, манипулирующей ею, и отправкой ее обратно в представление.
По сути, одна из моих моделей имеет список строк. Пользователь может настроить значение в текстовом поле, отобразить POST, и когда я проверяю в отладчике VS, модель, возвращающаяся к контроллеру, содержит текст, который они вводят. Этот текст добавляется в список в моей модели на серверной части, и модель отправляется обратно в представление, т.е. в View (myModel). Все просто, мой пользовательский интерфейс отображает неупорядоченный список html с единственным элементом в моем списке моделей. Однако, если я добавлю другое значение к своему текстовому вводу, снова отправлю модель, мой список теперь будет содержать только что добавленный текст. Это похоже на то, что модель создается заново, используя только значения в пользовательском интерфейсе во время ее размещения, что дает? Как я могу обеспечить постоянство списка между повторной отправкой модели туда-обратно между пользовательским интерфейсом и серверной частью?
Вот код для модели:
public class TestModel
{
[BindProperty]
[Required]
[MinLength(5)]
public string Name { get; set; }
[BindProperty]
[Required]
[MaxLength(10,ErrorMessage ="Input string is too long.")]
public string MyInput { get; set; }
[BindProperty]
[Required]
public IFormFile DescriptionFile { get; set; }
[BindProperty]
[Required]
public IFormFile MeasurementFile { get; set; }
public List<string> MeasurementFilenames { get; set; } = new List<string>();
public List<string> DescriptionFilenames { get; set; } = new List<string>();
[BindProperty]
public string DescriptionDirectory { get; set; }
public string DescriptionExportFile { get; set; }
[BindProperty]
public string MeasurementDirectory { get; set; }
public string MeasurementExportFile { get; set; }
//[Required]
[BindProperty]
public bool Session { get; set; } = false;
public TestModel()
{
}
public async Task OnPostAsync()
{
if (Session == false)
{
var token = DateTime.Now.Ticks.ToString();
var directory = Directory.CreateDirectory(@"uploads\" + token + @"\");
DescriptionDirectory = directory.CreateSubdirectory("Descriptions").FullName + @"\";
DescriptionExportFile = directory.CreateSubdirectory(@"Descriptions\Exports\").FullName + DescriptionFile.FileName;
MeasurementDirectory = directory.CreateSubdirectory("Measurements").FullName + @"\";
MeasurementExportFile = directory.CreateSubdirectory(@"Measurements\Exports\").FullName + MeasurementFile.FileName;
Session = true;
}
else if (Session == true)
{
DescriptionExportFile = DescriptionDirectory + @"Exports\" + DescriptionFile.FileName;
MeasurementExportFile = MeasurementDirectory + @"Exports\" + MeasurementFile.FileName;
}
if (!MeasurementFilenames.Contains(MeasurementFile.FileName))
{
MeasurementFilenames.Add(MeasurementFile.FileName);
}
if (!DescriptionFilenames.Contains(DescriptionFile.FileName))
{
DescriptionFilenames.Add(DescriptionFile.FileName);
}
var file = Path.Combine(DescriptionDirectory, DescriptionFile.FileName);
using (var fileStream = new FileStream(file, FileMode.Create))
{
await DescriptionFile.CopyToAsync(fileStream).ConfigureAwait(true);
}
file = Path.Combine(MeasurementDirectory, MeasurementFile.FileName);
using (var fileStream = new FileStream(file, FileMode.Create))
{
await MeasurementFile.CopyToAsync(fileStream).ConfigureAwait(true);
}
}
}
А вот код для просмотра:
@* I need to add the namespace of C# models I'm creating *@
@using FirstASPNETCOREProject.ViewModels
@* I need to identify the model which 'fits' this page, that is the properties of the model can be bound to entities on the view page, using "asp-for" *@
@model TestModel
@{
ViewData["Title"] = "Page for File Uploads";
}
@section Scripts{
}
<div asp-validation-summary="ModelOnly" style="color:white"> </div>
<div class="col-4">
<form method="post" enctype="multipart/form-data">
<div class="form-group">
<div>
<label class="font-weight-bold h6">Enter a Description File Name</label>
<input asp-for="Name" type="text" class="form-control" />
<span asp-validation-for="Name"></span>
</div>
<div>
<label class="font-weight-bold h6">Select a Description File</label>
<input asp-for="DescriptionFile" type="file" class="form-control-file" />
<span asp-validation-for="DescriptionFile"></span>
</div>
</div>
<br>
<div class="form-group">
<div>
<label class="font-weight-bold h6">Enter a Measurement File Name</label>
<input asp-for="MyInput" type="text" class="form-control">
<span asp-validation-for="MyInput"></span>
</div>
` <div>
<label class="font-weight-bold h6">Select a Measurement File</label>
<input asp-for="MeasurementFile" type="file" class="form-control-file">
<span asp-validation-for="MeasurementFile"></span>
</div>
</div>
<input asp-for="Session" type="checkbox" />
<input type="submit" value="Submit files" class="btn" />
</form>
</div>
<br>
<div>
<label >Active Description Files:</label>
<ul>
@if (Model != null && Model.DescriptionFilenames.Count > 0)
{
@foreach (var item in Model.DescriptionFilenames)
{
<li>@item</li>
}
}
</ul>
</div>
<br>
<div>
<label >Active Measurement Files:</label>
<ul>
@if (Model != null && Model.MeasurementFilenames.Count > 0)
{
@foreach (var item in Model.MeasurementFilenames)
{
<li>@item</li>
}
}
</ul>
</div>
<br>
<br>
<div>
@Html.ActionLink("Description File", "DownloadFile", "App", new { file = Model.DescriptionExportFile }) <span class="badge">@Model.DescriptionFilenames.Count.ToString()</span>
<br>
@Html.ActionLink("Measurement File", "DownloadFile", "App", new { file = Model.MeasurementExportFile })<span class="badge">@Model.MeasurementFilenames.Count.ToString()</span>
<br>
</div>
<br>
<br>
<br>
<br>