通过以下代码,我可以使用 Orchard.Forms 手动创建一个字段并将其显示在视图中。这是代码(仅相关):
MyLayoutForm.cs
:
....
public void Describe(DescribeContext context)
{
Func<IShapeFactory, object> myInformation =
shape => {
var f = Shape.Form(
Id: "MyBasicInformation",
BasicInformation: Shape.Fieldset(
Title: T("Basic Information"),
FirstName: Shape.TextBox(
Id: "FirstName", Name: "First Name",
Title: T("First Name"),
Description: T("The name for this field"),
Required: true
)
)
);
return f;
};
context.Form("MyBasicInformation", myInformation);
}
....
MyContoller.cs
:
....
[Themed]
public ActionResult BasicInformation()
{
var myBasicInformation = _formManager.Build("MyBasicInformation");
// MyData below is my View Model
var myData = new MyData { Form = myBasicInformation };
return View(myData);
}
[Themed]
[HttpPost, ActionName("BasicInformation")]
public ActionResult BasicInformationPOST(string nextButton, FormCollection formCollection)
{
_formManager.Validate(new ValidatingContext { FormName = "MyBasicInformation", ModelState = ModelState, ValueProvider = ValueProvider });
if ((nextButton != null) && ModelState.IsValid)
{
return RedirectToAction("PersonalInformation");
}
var myBasicInformation = _formManager.Build("MyBasicInformation");
_formManager.Bind(myBasicInformation, formCollection);
// MyData below is my View Model
var myData = new MyData { Form = myBasicInformation };
return View(myData);
}
....
MyData.cs
(查看模型):
public class MyData
{
public dynamic Form { get; set; }
}
BasicInformation.cshtml
:
....
@using (Html.BeginFormAntiForgeryPost())
{
....
@Display(Model.Form.BasicInformation.FirstName)
<input type="submit" name="nextButton" value="Next" />
....
}
....
截至目前,名字文本框在我的视图中正确显示。我正在使用“下一步”按钮转到下一个视图(稍后将是另一个问题)。如果单击“下一步”并且文本框为空,验证将触发(我省略了验证部分)。如果我填写文本框并单击“下一步”,它会将我带到下一个视图 (PersonalInformation.cshtml)。在第二个视图上单击“返回”显然会显示一个空白的名字文本框,因为我还没有弄清楚如何做到这一点。
我基本上已经使用 Projections/Rules/CustomForms 模块将代码拼凑在一起,以实现这一目标。但是,我已经尝试过那里和其他地方的示例来保存数据(实际上,可能使用 Session 来持久化它,但如果可能的话,这又是另一个关于如何做到这一点的问题——我知道其中的一些警告)。此外,我上面列出的那些模块中的代码正在向管理屏幕中的特定模块(例如,投影)添加操作,因此这些代码没有帮助(而且我无法完全弄清楚发生了什么)。
那么,我该如何保存,例如“FirstName”?
我创建了一个记录和一个简单的迁移。因为我只是想存储非内容数据,所以我没有创建驱动程序或处理程序。但我不知道这是正确的方法,而且我不确定在我的控制器中放入什么代码。
任何例子都非常感谢。谢谢。