Razor Pages: значения, отличные от OnGet () до OnPost () - PullRequest
0 голосов
/ 18 июня 2020

Я работаю над ASP. NET основной веб-страницей, используя Razor Pages. На одной странице клиент добавляется или выбирается, и идентификатор customer_id передается правильно в функции OnGet (видно при отладке). Когда я затем прошу пользователя заполнить форму, я пытаюсь позвонить в базу данных сервера SQL, используя Entity Framework. Все должно работать правильно, однако в OnPostAsyn c (), когда я пытаюсь импортировать значение customer_id, которое я установил в OnGet (), я получаю сообщение об ошибке, потому что значение каким-то образом устанавливается на 0 вместо того, что было у меня ранее установлен как. Я не знаю, почему это происходит, поскольку я обычно новичок в Razor Pages и Entity Framework, но я опубликовал код ниже. Любые предложения были бы замечательными!

AddAssessment.cs html .cs:

namespace CustomerPageTest.Pages.Assessment
{
public class AddAssessmentModel : PageModel
{
    private readonly CustomerPageTest.Data.CustomerPageTestContext _context;

    public AddAssessmentModel(CustomerPageTest.Data.CustomerPageTestContext context)
    {
        _context = context;
    }

    public static List<SelectListItem> InDatabaseUserData()
    {
        List<SelectListItem> Users = new List<SelectListItem>();

            string connString = "Data Source = DESKTOP-5A23I9M; Initial Catalog = DataWarehouse; User ID = sa; pwd = 2128Swan";
            string commandString = "SELECT user_id, name FROM KelderUser";

            SqlConnection conn = new SqlConnection(connString);
            SqlDataAdapter adapter = new SqlDataAdapter(commandString, conn);
            DataTable dtCustomers = new DataTable();
            adapter.Fill(dtCustomers);

            foreach (DataRow dataRow in dtCustomers.Rows)
            {
                SelectListItem temp = new SelectListItem()
                {
                    Value = dataRow[0].ToString(),
                    Text = dataRow[1].ToString()
                };
                Users.Add(temp);
            }
        return Users;
    }

    [BindProperty]
    public CustomerPageTest.Assessment Assessment { get; set; } = new CustomerPageTest.Assessment();
    public List<SelectListItem> SelectUser { get; set; } = new List<SelectListItem>();

    public void OnGet(int customerId)
    {
        SelectUser = InDatabaseUserData();
        Assessment.customer_id = customerId;
        if(Assessment == null)
        {
            return RedirectToPage("/Customer/List");
        }
        return Page();
    }

    // To protect from overposting attacks, enable the specific properties you want to bind to, for
    // more details, see https://aka.ms/RazorPagesCRUD.
    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        foreach(var item in SelectUser)
        {
            if (item.Selected)
            {
                try { Assessment.user_id = Convert.ToInt32(item.Value); } catch (Exception) { }
            }
        }

        try { Assessment.imported_data_datetime = Convert.ToDateTime(Assessment.imported_data_datetime); } catch(Exception) { }
        _context.Assessment.Add(Assessment);
        await _context.SaveChangesAsync();

        return RedirectToPage("/Customer/List");
    }
}

}

Затем AddCustomer.cs html:

@page
@model CustomerPageTest.Pages.Assessment.AddAssessmentModel

@{
    ViewData["Title"] = "AddAssessment";
}

<h1>AddAssessment</h1>

<h4>Assessment</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Assessment.vcenter" class="control-label"></label>
                <input asp-for="Assessment.vcenter" class="form-control" />
                <span asp-validation-for="Assessment.vcenter" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Assessment.imported_data_datetime" class="control-label"></label>
                <input asp-for="Assessment.imported_data_datetime" class="form-control" />
                <span asp-validation-for="Assessment.imported_data_datetime" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Assessment.notes" class="control-label"></label>
                <input asp-for="Assessment.notes" class="form-control" />
                <span asp-validation-for="Assessment.notes" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Assessment.user_id"></label>
                <select class="form-control" asp-for="Assessment.user_id" asp-items="Model.SelectUser">
                    <option value="">Select a User</option>
                </select>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-page="/Customer/List">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

Кроме того, если у вас есть какие-либо вопросы о том, что происходит в моем коде, дайте мне знать, так как до этого есть другие классы и страницы. Основная идея заключается в том, что у меня есть класс оценки с целым числом: customer_id, который нужно установить, но он не устанавливается.

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Я пишу демо и обнаружил, что вы не привязывали customer_id в cs html, поэтому, когда вы публикуете дату в cs html .cs, вы не публикуете customer_id. Вы можете добавить <input hidden asp-for="Assessment.customer_id" class="form-control" /> в cs html для привязки customer_id.

Вот работала демонстрация:

cs html:

<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Assessment.vcenter" class="control-label"></label>
                <input asp-for="Assessment.vcenter" class="form-control" />
                <span asp-validation-for="Assessment.vcenter" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Assessment.imported_data_datetime" class="control-label"></label>
                <input asp-for="Assessment.imported_data_datetime" class="form-control" />
                <span asp-validation-for="Assessment.imported_data_datetime" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Assessment.notes" class="control-label"></label>
                <input asp-for="Assessment.notes" class="form-control" />
                <span asp-validation-for="Assessment.notes" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Assessment.user_id"></label>
                <select class="form-control" asp-for="Assessment.user_id" asp-items="Model.SelectUser">
                    <option value="">Select a User</option>
                </select>
            </div>
            <input hidden asp-for="Assessment.customer_id" class="form-control" />
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

cs html. cs:

public class AddCustomerModel : PageModel
    {
        [BindProperty]
        public Assessment Assessment { get; set; } = new Assessment();
        public List<SelectListItem> SelectUser { get; set; } = new List<SelectListItem>();
        public IActionResult OnGet()
        {
            for (int i = 1; i < 6; i++) {
                SelectListItem temp = new SelectListItem()
                {
                    Value = i+"",
                    Text = "user"+i
                };
                SelectUser.Add(temp);
            }
            Assessment.customer_id = 2;
            Assessment.vcenter = "vcenter";
            return Page();


        }
        public IActionResult OnPost() {
            if (!ModelState.IsValid)
            {
                return Page();
            }
            return Page();
        }
    }

Результат: enter image description here

0 голосов
/ 19 июня 2020

Причина этого в том, что HTTP не имеет состояния. Любое состояние (данные), которое вы создали в одном запросе, уничтожается после обработки этого запроса, если вы не предпримете шаги для его сохранения.

Существует несколько способов управления состоянием в Razor Pages (https://www.learnrazorpages.com/razor-pages/state-management), но в вашем случае вы должны использовать скрытое поле формы, отправляя выбранный идентификатор клиента в обработчик OnPost.

...