在一个剃刀视图(ASP.NET Core)中创建多个模型



我的视图中有多个create表单,它们总是向控制器发送空数据。

这是我的代码视图模型:

public class IndexModel : PageModel
{
public List<Device> devicelist { get; set; }
public Process proclist { get; set; }
public Extratime extras { get; set; }
public Foodadd foods { get; set; }
public void OnGet()
{
devicelist = new List<Device>();
proclist = new Process();
extras = new Extratime();
foods = new Foodadd();
}
}

在我看来,有一种表单总是发送空数据:

<form method="post" asp-action="AddTime" style="direction: rtl;">
<input type="hidden" asp-for="@Model.proclist.DeviceId" value="@item.Id" />
<input type="hidden" asp-for="@Model.proclist.Userid" value="@currentUser.Id" />
<div class="form-group">
<select asp-for="@Model.proclist.IsLimited" class="form-control" id="cc">
<option value="true">limited</option>
<option value="false">Open</option>
</select>
</div>
<div class="form-group" id="pp">
<input type="number" asp-for="@Model.proclist.hours" class="form-control home" placeholder="1.5" step=".01">
</div>
<div class="form-group">
<select asp-for="@Model.proclist.IsSingle" class="form-control">
<option value="true">single</option>
<option value="false">multi</option>
</select>
</div>
<button type="submit" class="btn btn-primary">Enable</button>
</form>

这就是我的控制器对视图的期望(返回一个NullReferenceException,表示视图中缺少数据。(:

public IActionResult AddTime(Process data)
{
using (KoraContext db = new KoraContext())
{
var tdevice = db.Devices.Where(x => x.Id == data.DeviceId).FirstOrDefault();
tdevice.Isbusy = "true"; // Gives a NullReferenceException.
db.Processes.Add(data);
db.SaveChanges();
return RedirectToAction("index", new { Controller = "Home", Action = "Index" });
}
}

您有一个方法为"的窗体;张贴";但是您的页面模型没有OnPost方法。您还需要添加[BindProperty]属性:

public class IndexModel : PageModel
{
public List<Device> devicelist { get; set; }
[BindProperty]
public Process proclist { get; set; }
public Extratime extras { get; set; }
public Foodadd foods { get; set; }
public void OnGet()
{
devicelist = new List<Device>();
proclist = new Process();
extras = new Extratime();
foods = new Foodadd();
}
public void OnPost()
{
// do something with proclist
}
}

https://www.learnrazorpages.com/razor-pages/forms

编辑:

您可以像这样添加多个OnPost处理程序(命名处理程序方法(:

public void OnPostAddTime()
{
...
}
public void OnPostAddFood()
{
...
}

以及形式:

<form asp-page-handler="addtime" method="post">
...
</form>
<form asp-page-handler="addfood" method="post">
...
</form>

https://www.learnrazorpages.com/razor-pages/handler-methods

我认为您误解了Razor Page的使用方法。在Razor Page中,Backstage中没有Controller,所以如果你想设置HttpGetHttpPost操作,你需要设置像OnGetxxxxOnPostxxx这样的方法名称(xxx是方法名称(,然后如果你想在PageModelView之间传递模型,你需要添加[BindProperty],所以在你的PageModel中,你需要更改代码,比如:

public class IndexModel : PageModel
{
public List<Device> devicelist { get; set; }
[BindProperty]
public Process proclist { get; set; }
public Extratime extras { get; set; }
public Foodadd foods { get; set; }
public void OnGet()
{
devicelist = new List<Device>();
proclist = new Process();
extras = new Extratime();
foods = new Foodadd();
}
public IActionResult OnPostAddTime()
{
using (KoraContext db = new KoraContext())
{
var tdevice = db.Devices.Where(x => x.Id == proclist.DeviceId).FirstOrDefault();
tdevice.Isbusy = "true"; // Gives a NullReferenceException.
db.Processes.Add(proclist);
db.SaveChanges();
return RedirectToPage(xxxxxxx);
}
}
}

然后在视图中,您可以使用asp-page-handler=xxx指定要提交的方法。

有关更多信息,请参阅此链接。

最新更新