【问题标题】:Mvc 4 exchanging data between controller and ViewMvc 4 在控制器和视图之间交换数据
【发布时间】:2014-01-30 11:19:44
【问题描述】:

我正在尝试在 mvc4 中创建一个小项目,但我遇到了这个问题。 我想做一个登记表。用户必须填写第一个表单,当他点击下一个时,所有数据将被发送到名为 User 的模型中的另一个视图(不保存在数据库中) 并且在他填写至少三个可用时间后,它将注册整个信息(第一个和第二个表格)。

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

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

【问题讨论】:

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


【解决方案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" />
}

第一步视图 -

@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 好的向导控件 -

【讨论】:

    【解决方案2】:

    由于您的表单将被发布并且您有一个模型,您可以将其转发到下一个视图。

    [HttpPost]
    public ActionResult FirstRegistration(FirstRegistrationModel model)
    {
        if (ModelState.IsValid)
        {
            SecondRegistrationModel secondModel = new SecondRegistrationModel();
            MapFirstToSecond(model, secondModel);
    
            return View("SecondRegistration", secondModel);
        }
        else
        {
            return View(model);
        }
    }
    

    【讨论】:

      【解决方案3】:

      一种解决方案是通过帖子将模型从第一个视图传递到第二个视图。

      例如

      假设你有一个代表你的表单的模型

      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 的属性和值

      【讨论】:

      • 嗨詹姆斯我的问题是当我点击第二个表单中的保存时获取第一个表单的数据。因为当 Icick 保存时,我只获取数据(日期和持续时间)
      • 您可以访问第二个表单中@Model 对象的所有值。将这些值输出到匹配的隐藏输入中,例如 然后,当您发布第二个表单中的所有值时,您将拥有所有这些值。
      • 另一种方法是从 FormOne 缓存数据,然后从 FormTwo Action 访问它。因此,您可以将对象存储在缓存中,也可以将其存储为会话变量。
      【解决方案4】:

      正如 Andrei 和 Tim 所提到的,您可以发布第一个表单中的数据并将它们传递给第二个表单。这意味着当提交第二个表单时,表单一和表单二的数据应该被发送到 action 方法。但是,还有其他选择。

      您仍然可以在 POST 上将数据发布到 FirstRegistration 操作方法,但这次将其保存到 TempData。发布第二个表单后,您可以从 TempData 检索数据。这将消除将数据从 FormOne 传递到 FormTwo 的需要。有关 TempData 的更多信息,请访问 MSDN。只是一个警告,即 TempData 是短暂的,并在后续请求后立即被清除。因此,如果用户有可能在第一个和第二个之间发出请求,那么数据就消失了。

      另一种选择是使用会话。这与使用 TempData 相同,但您将决定数据可以持续多长时间。

      另一种选择是将数据保存在 HTML5 会话存储或本地存储上(所有主流浏览器都支持)。

      【讨论】:

        【解决方案5】:

        我可以使用以下逻辑将数据存储在隐藏字段中并提交

        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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多