Я пытаюсь создать веб-приложение для отслеживания лекарств для пациентов в аптеках, используя EF CORE и MVC, но столкнулся с проблемой. У меня есть представление, настроенное для создания сценария с использованием базовых CRUD-операций, которое работает нормально, но я не пытаюсь реализовать дополнительную функциональность. В частности, я хочу возможность добавлять несколько элементов в один скрипт. Моя БД и существующие представления обновлены, но я пытаюсь найти лучший способ сделать эту работу.
У меня есть действие контроллера GET, которое создает экземпляр моей модели представления с учетом идентификатора пациент. Затем моя форма отправляет сообщение либо действию, которое просто создает сценарий с одним элементом, либо действию, которое создает сценарий, добавляет элемент, а затем перенаправляет обратно в представление создания, чтобы добавить другой элемент в тот же сценарий.
Есть ли в моем контроллере способ перенаправления из действия post обратно в действие get и одновременной передачи нескольких параметров?
GET action
[HttpGet]
public async Task<IActionResult> Create(
int id,
string sort,
string currentFilter,
string search,
int? pageNumber)
{
ViewData["NameSortParam"] = String.IsNullOrEmpty(sort) ? "name_desc" : "";
ViewData["PackSortParam"] = sort == "pack" ? "pack_desc" : "pack";
ViewData["GenSortParam"] = sort == "gen" ? "gen_desc" : "gen";
ViewData["StockSortParam"] = sort == "stock" ? "stock_desc" : "stock";
ViewData["CurrentSort"] = sort;
if (!String.IsNullOrEmpty(search))
{
pageNumber = 1;
}
else
{
search = currentFilter;
}
ViewData["CurrentFilter"] = search;
var drugs = from drug in _context.Drug
join generic in _context.Generic on drug.GenericId equals generic.Id
select drug;
if (!String.IsNullOrEmpty(search))
{
drugs = drugs.Where(d => d.Name.Contains(search)
|| d.Generic.Name.Contains(search));
}
switch (sort)
{
case "name_desc":
drugs = drugs.OrderByDescending(d => d.Name);
break;
case "pack":
drugs = drugs.OrderBy(d => d.PackSize);
break;
case "pack_desc":
drugs = drugs.OrderByDescending(d => d.PackSize);
break;
case "cost":
drugs = drugs.OrderBy(d => d.CostPrice);
break;
case "cost_desc":
drugs = drugs.OrderByDescending(d => d.CostPrice);
break;
case "gen":
drugs = drugs.OrderBy(d => d.Generic.Name);
break;
case "gen_desc":
drugs = drugs.OrderByDescending(d => d.Generic.Name);
break;
case "stock":
drugs = drugs.OrderBy(d => d.StockQty);
break;
case "stock_desc":
drugs = drugs.OrderByDescending(d => d.StockQty);
break;
default:
drugs = drugs.OrderBy(d => d.Name);
break;
}
drugs = drugs.Include(d => d.Generic);
int pageSize = 5;
var patient = await _context.Patient.FindAsync(id);
var vm = new NewScriptViewModel()
{
Patient = patient,
PatientId = patient.Id,
Prescribers = await _context.Prescriber.ToListAsync(),
Drugs = await PaginatedList<Drug>.CreateAsync(drugs.AsNoTracking(), pageNumber ?? 1, pageSize)
};
ViewData["PrescriberId"] = new SelectList(_context.Prescriber, "Id", "FullName", patient.PrescriberId);
return View(vm);
}
Действие POST - добавить следующий элемент в тот же сценарий
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(bool FirstItem, [Bind("PatientId, PrescriberId")] Script script, [Bind("DrugId, Qty, Directions")] ScriptDrug scriptDrug)
{
if (ModelState.IsValid)
{
if (FirstItem)
{
//create script
_context.Add(script);
await _context.SaveChangesAsync();
//add item
scriptDrug.ScriptId = script.Id;
var drug = _context.Drug.Find(scriptDrug.DrugId);
drug.StockQty -= scriptDrug.Qty;
_context.Add(scriptDrug);
await _context.SaveChangesAsync();
//redirect to create to add new item to same script
}
}
//redirect back to view
}
Надеюсь, я объяснил это адекватно, но дайте мне знать, если мне потребуется предоставить какие-либо дополнительные информация.
Примечание: модель просмотра
public class NewScriptViewModel
{
public int ScriptId { get; set; }
public Patient Patient { get; set; }
public int PatientId { get; set; }
public IEnumerable<Prescriber> Prescribers { get; set; }
public int PrescriberId { get; set; }
public PaginatedList<Drug> Drugs { get; set; }
public int DrugId { get; set; }
public int Qty { get; set; }
public string Directions { get; set; }
public bool FirstItem { get; set; }
public NewScriptViewModel()
{
FirstItem = true;
}
}