如何手动保存Orchard.Forms字段?

时间:2013-07-02 15:45:20

标签: orchardcms

使用以下代码,我可以使用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和一个简单的迁移。由于我只想存储非内容数据,因此我没有创建驱动程序或处理程序。但我不知道这是正确的方法,我不知道在我的控制器中放入什么代码。

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

1 个答案:

答案 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