Mvc 4在控制器和View之间交换数据

时间:2014-01-30 11:19:44

标签: c# asp.net-mvc asp.net-mvc-4

我正在尝试在mvc4中创建一个小项目,但我遇到了这个问题。 我想要一份报名表。用户必须填写第一个表单,当他点击进入下一个表单时,所有数据将被发送到名为User的模型中的其他View(不保存数据库) 在他填写至少三个可用时间之后,它将注册整个信息(第一和第二形式)。enter image description here

问题是如何获取发送到第二个视图的第一个视图的数据。

class User {
FName
 LName
....
 List<AvailableDate> dts;
 }

5 个答案:

答案 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" />
}

输出 -

enter image description here

我还建议你研究一些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
}