1

通过以下代码,我可以使用 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”?

我创建了一个记录和一个简单的迁移。因为我只是想存储非内容数据,所以我没有创建驱动程序或处理程序。但我不知道这是正确的方法,而且我不确定在我的控制器中放入什么代码。

任何例子都非常感谢。谢谢。

4

1 回答 1

1

正如我在评论中提到的,如果您需要在数据库中存储非内容数据,请按照我在评论中提供的答案进行操作,但是在会话中存储数据要简单得多。尝试在会话中访问和存储数据:

 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"]。另一件事,不要忘记Session.Abandon()在完成用户注册后打电话。这样做:

//all user information is gathered and stored in the `database` so let's end user session

   HttpContext.Session.Abandon();

编辑

用属性标记你的课程(你计划在会话中疼痛) ,你可以在这里Serializable阅读为什么你必须这样做。

于 2013-07-02T17:38:37.727 回答