我正在尝试在mvc4中创建一个小项目,但我遇到了这个问题。 我想要一份报名表。用户必须填写第一个表单,当他点击进入下一个表单时,所有数据将被发送到名为User的模型中的其他View(不保存数据库) 在他填写至少三个可用时间之后,它将注册整个信息(第一和第二形式)。
问题是如何获取发送到第二个视图的第一个视图的数据。
class User {
FName
LName
....
List<AvailableDate> dts;
}
答案 0 :(得分:1)
由于您的表单将被发布并且您有一个模型,因此您可以将其转发到下一个视图。
[HttpPost]
public ActionResult FirstRegistration(FirstRegistrationModel model)
{
if (ModelState.IsValid)
{
SecondRegistrationModel secondModel = new SecondRegistrationModel();
MapFirstToSecond(model, secondModel);
return View("SecondRegistration", secondModel);
}
else
{
return View(model);
}
}
答案 1 :(得分:1)
一种解决方案是将模型从第一个视图通过帖子传递到第二个视图。
e.g。
假设您有一个代表您的表单的模型
public class FormOne
{
property string FName { get; set; }
property string LName { get; set; }
property string Location { get; set; }
property string Login { get; set; }
property string Password { get; set; }
}
然后在FormOneView
上填写表单
@using(Html.BeginForm(“FormTwoView”,“ControllerName”)){
@* form inputs which match the FormOne model *@
}
您将此帖子发布到FormTwo
视图,然后将对象传递到视图中。
public ActionResult FormTwoView(FormOne formOne){
Return View("FormTwoView", formOne);
}
在FormTwoView
中,您可以告诉它接受FormOne类
@model Namespace.FormOne
然后在FormTwoView中,您可以访问FormOne
答案 2 :(得分:1)
正如Andrei和Tim所提到的,你可以发布第一张表格中的数据并将它们传递给第二张表格。这意味着当提交第二个表单时,表单1和表单2中的数据应该发布到action方法。但是,还有其他选择。
您仍然可以在POST上将数据发布到FirstRegistration操作方法,但这次将其保存到TempData。发布第二个表单后,您可以从TempData中检索数据。这将消除将数据从FormOne传递到FormTwo的需要。关于MSDN上的TempData的更多信息。只是警告TempData是短暂的,并在后续请求后立即清除。因此,如果用户可能在第一个和第二个之间发出请求,那么数据就会消失。
另一种选择是使用Session。它与使用TempData相同,但您将决定数据可以持续多长时间。
另一种选择是将数据保存在HTML5会话存储或本地存储上(所有主流浏览器都支持)。
答案 3 :(得分:1)
这是我的解决方案。这是一个工作示例,它将在步骤之间遍历相同的用户模型。它使用模型绑定概念。需要对代码进行更多细化,并进行适当的验证,数据时间处理等。在最后一步结束时,您应该看到完整的填充模型,您可以将其保存。
模型 -
public class User
{
public string Fname { get; set; }
public string Lname { get; set; }
public List<AvailabilityDates> Dates { get; set; }
}
public class AvailabilityDates
{
public DateTime? date { get; set; }
}
控制器操作 -
public class UserController : Controller
{
public ActionResult Index()
{
User u = new User();
return View(u);
}
public ActionResult FirstStep(User u)
{
u.Dates = new List<AvailabilityDates>();
u.Dates.Add(new AvailabilityDates() { date = null });
u.Dates.Add(new AvailabilityDates() { date = null });
return View(u);
}
public ActionResult LastStep(User u)
{
// Do your stuff here
return null;
}
}
索引视图 -
@model MVC.Controllers.User
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@using (Html.BeginForm("FirstStep", "User", FormMethod.Post))
{
@Html.LabelFor(model => model.Fname, new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.Fname)
@Html.ValidationMessageFor(model => model.Fname)
@Html.LabelFor(model => model.Lname, new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.Lname)
@Html.ValidationMessageFor(model => model.Lname)
<input type="submit" value="Create" class="btn btn-default" />
}
FirstStep View -
@model MVC.Controllers.User
@{
ViewBag.Title = "FirstStep";
}
<h2>FirstStep</h2>
@using (Html.BeginForm("LastStep", "User", FormMethod.Post))
{
@Html.HiddenFor(model => model.Fname);
@Html.HiddenFor(model => model.Lname);
for (int i = 0; i < Model.Dates.Count; i++)
{
@Html.LabelFor(model => Model.Dates[i].date, new { @class = "control-label col-md-2" })
@Html.EditorFor(model => Model.Dates[i].date)
@Html.ValidationMessageFor(model => Model.Dates[i].date)
}
<input type="submit" value="Create" class="btn btn-default" />
}
输出 -
我还建议你研究一些JQuery好的向导控件 -
答案 4 :(得分:1)
我可以使用以下逻辑将数据存储在隐藏字段中并提交
public class RegistrationViewModel
{
public BasicInfo Form1{get;set;}
public RegistrationInfo Form2{get;set;}
public string JsonBasicInfo {get;set;}
}
当用户填写第一个表单数据时,单击“提交”,以JSON格式保存用户填充的数据并将其传递到另一个视图
public ShowNext(RegistrationViewModel model)
{
var prevFormData=model.Form1
model.JsonBasicInfo =JsonConvert.SerializeObject(model.BasicInfo);
return View("RegistrationInfo", model);
}
在RegistrationInfo.cshtml中
@model RegistrationViewModel
@@Html.TextBoxFor(m=>m.Form2.UserName)
//All registration related html helpers
@Html.HiddenFor(m=>m.JsonBasicInfo)
最后,当您提交注册表
public ActionResult SaveComplete(RegistrationViewModel model)
{
model.BasicInfo=JsonConvert.DeserializeObject<BasicInfo>(model.JsonBasicInfo);
//save whole data
}