我的视图中有多个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
,所以如果你想设置HttpGet
或HttpPost
操作,你需要设置像OnGetxxxx
和OnPostxxx
这样的方法名称(xxx是方法名称(,然后如果你想在PageModel
和View
之间传递模型,你需要添加[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
指定要提交的方法。
有关更多信息,请参阅此链接。