使用以下代码,我可以使用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" />
....
}
....
截至目前,First Name文本框在我的视图中正确显示。我正在使用“下一步”按钮转到下一个视图(稍后这将是另一个问题)。如果单击“下一步”并且文本框为空,则验证将触发(我遗漏了验证部分)。如果我填写文本框并单击“下一步”,它会转到下一个视图(PersonalInformation.cshtml)。单击第二个视图上的“返回”显然会显示一个空白的名字文本框,因为我还没有想出如何做到这一点。
我基本上使用Projections / Rules / CustomForms模块将代码修补到一起来实现这一目标。但是,我已经在那里和其他地方尝试过保存数据的例子(实际上,为了保留它可能会使用Session,但这又是另一个问题,如果可能的话,如何做到这一点 - 我知道其中的一些注意事项)。另外,我上面列出的那些模块中的代码是在Admin屏幕中向特定模块添加操作(例如,Projections),因此代码没有帮助(加上我无法完全弄清楚发生了什么)。
那么,我怎样才能保存,例如“FirstName”?
我创建了一个Record和一个简单的迁移。由于我只想存储非内容数据,因此我没有创建驱动程序或处理程序。但我不知道这是正确的方法,我不知道在我的控制器中放入什么代码。
非常感谢任何例子。感谢。
答案 0 :(得分:1)
正如我在评论中提到的,如果你需要在数据库中存储非内容数据,那么请按照我在评论中提供的答案,但是在session.try中存储数据以便在会话中访问和存储数据时要简单得多:
private readonly IWorkContextAccessor _workContextAccessor;
[Themed]
[HttpPost, ActionName("BasicInformation")]
public ActionResult BasicInformationPOST(string nextButton, FormCollection formCollection)
{
.
.
.
if ((nextButton != null) && ModelState.IsValid)
{
var HttpContext = _workContextAccessor.GetContext().HttpContext;
var basicInfo = new BasicInformation();
TryUpdateModel(basicInfo);
HttpContext.Session["BasicInfo"] = basicInfo;
return RedirectToAction("PersonalInformation");
}
.
.
.
return View(myData);
}
您可以稍后使用HttpContext.Session["BasicInfo"]
访问您的个人信息。另外,在注册user.do之后不要忘记致电Session.Abandon()
:
//all user information is gathered and stored in the `database` so let's end user session
HttpContext.Session.Abandon();
修改强>
使用Serializable
属性标记您的课程(您已计划在会话中疼痛),您可以阅读为什么必须这样做here。