我正在学习 ASP.NET MVC,由于我的模型变得有点复杂,我遇到了一些不寻常的问题。
我有特定的模型,其中的项目可以处于不同的状态。该项目可以从一种状态转换到另一种状态。允许的转换在“转换”模型/表中定义。
为了获取特定状态的可用转换,我使用列出项目的索引页面,并向代码添加第二个
foreach
循环:
@foreach (var transition in item.State.Transitions) {
<form asp-action="@transition.TransitionName">
<input type="hidden" asp-for="@item.Id" />
<input type="submit" value="@transition.Description" class="btn btn-warning" />
</form>}
为每个项目正确获取
@item.Id
的值。但是我注意到 @item.Id
是一个“局部变量”,源代码是 id="item_Id" name="item.Id" value="1"
。
相应地,没有
id
传输到控制器,我无法实现代码部分的其余部分,这将根据使用的转换设置新的状态值。
由于我不知道该怎么做,任何提示将不胜感激。
这是一个 POST 处理程序,可与 Razor 模板生成的表单配合使用:
public ActionResult OnPost(string action, Item item)
{
//Seeing a request parameter called “item.Id” OR just “Id” (case
//insensitive), the framework will create an Item instance and
//fill the Id property accordingly.
//
//This is prone to overposting and you should probably not do it
//or at least do additional validation. If your Item class has
//a settable property called “Action” that will also be set!
//Likely you don’t care about that, but it’s worth noting.
//
//The Item object will of course be incomplete and only have the
//values provided by the request.
//
//If no fitting parameter is posted or it is not a valid integer
//the framework will still call this handler and pass it a new
//Item instance with all default values, i.e. Id will be 0.
if (item.Id <= 0)
return new BadRequestResult();
return new ContentResult()
{
StatusCode = 200,
ContentType = @"text/plain; charset=utf-8",
Content = $"Congratulations, you have transitioned Item {item.Id} to {action}.",
};
}
只要您的
Item
类具有,此模型绑定就会自动工作
Id
属性。否则你会得到一个例外。