Как вы можете поддерживать состояние модели в ASP. NET Core между многократным отображением модели в виде и отправкой модели обратно в контроллер? - PullRequest
0 голосов
/ 14 апреля 2020

Я довольно новичок в 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>

1 Ответ

1 голос
/ 14 апреля 2020

Все, что вы хотите сохранить, должно быть в опубликованных данных и иметь [BindProperty]. MeasurementFilenames & DescriptionFilenames не в форме, поэтому их содержимое будет потеряно.

    [BindProperty]
    public List<string> DescriptionFilenames { get; set; } = new List<string>();
    @for(int i=0; i< Model.DescriptionFilenames.Count; i++)
    {
        <li><input type="hidden" asp-for="DescriptionFilenames[i]" />@Model.DescriptionFilenames[i]</li>
    }
...