【问题标题】:How can i transfer one view form to another view in MVC3?如何将一个视图表单转移到 MVC3 中的另一个视图?
【发布时间】:2012-03-14 21:14:50
【问题描述】:

任何人都可以帮助在 MVC3/C# 中将表单从一个视图转移到另一个视图吗?

这是场景:

1) 我创建了一个页面,我有大约 6 个字段供用户输入,一旦用户提交该字段,它会将他们重定向到审查页面。

2)一旦用户进入评论页面,他在创建页面中输入的信息应该会出现在那里(供用户确认)。

3) 评论页面上会有一个编辑按钮,所以如果用户点击编辑按钮,他应该回到他输入所有信息的创建页面,这样他就可以再次更新它们。

我们可以使用 ViewData/ViewBag 或局部视图来处理这种情况吗?我不知道该怎么做。

【问题讨论】:

  • PartialView 足以实现您的场景。

标签: c# asp.net-mvc asp.net-mvc-3 model-view-controller .net-4.0


【解决方案1】:

您应该在 Models 文件夹中创建一个类,我们称之为 MyViewModel,您将在该类中定义需要用户编辑的所有 6 个属性。 在 create 视图中,您将在一个定义为回发到您的 review 操作的表单元素中显示所有输入字段。您观点的重要部分将是:

@model MyViewModel
@using (Html.BeginForm("Review", "MyController"))
{
   //here there's your input field
   @Html.TextBoxFor(m => m.prop1)
   // and so on
}

在 MyController 类中,您将拥有如下定义的 Review 方法

public ActionResult Review(MyModel mm) 
{
    if (ModelState.IsValid)
    {
        return View(mm);
    } else return RedirectToAction("Create");
}

最后,在您的 Review 视图中,您将拥有:

 @model MyViewModel
 //show up all the field to be reviewed
 @Html.DisplayFor(m=>m.prop1)
 //and so on
 // now a form to pastback again all the data to the edit page
 @using (Html.BeginForm("Edit", "MyController"))
 {
   //here there's your hidden field
   @Html.HiddenFor(m => m.prop1)
   // and so on
   <input type="submit" value="Re-edit the fields"/>
 }

您的控制器类 MyController 将具有以下代码:

public class ViaggioController : Controller
{
public ActionResult Create() 
{
    var emptyModel = new MyViewModel();
    return RedirectToAction("Edit", new { mm = emptyModel });
}
public ActionResult Edit(MyViewModel mm) 
{    
    return View(mm);
}

public ActionResult Review(MyViewModel mm) 
{
    if (ModelState.IsValid)
    {
        return View(mm);
    } 
    else 
        return RedirectToAction("Create");
}
}

【讨论】:

  • 为什么我需要重定向到编辑页面:public ActionResult Create() { var emptyModel = new MyViewModel(); return RedirectToAction("Edit", new { mm = emptyModel }); }
  • 我的意思是 Create 是我的 Get 方法,所以如果我从那里重定向到 Edit,它会给我一个错误。
  • 这个想法是,create 只不过是一个带有非预加载数据的编辑页面,对吗?这样做,您可以创建一个全新的(空)模型,并重复使用您的编辑操作。或者你可以准备你的空模型并使用另一个视图将模型传递给另一个视图 return View("Edit", mm); 你喜欢
  • 您收到什么样的错误? (PS:我在网站上即时编写代码,也许我犯了一些错误......但它应该给你的想法)
  • 不,你没有犯任何错误......它现在正在工作:) 非常感谢!我唯一不需要的是这两行: var emptyModel = new MyViewModel(); return RedirectToAction("Edit", new { mm = emptyModel });
【解决方案2】:

我看到您使用的是 Asp.Net MVC,所以我假设您的 Create View 由一个模型对象支持,该对象包含用户输入的 6 个字段,并且您使用的是内置的 Model Validation ?如果是这样,您需要做的就是:

  1. 在表单发布到您的 Create Controller Httpost Action 并且模型状态有效时,重定向到您的 Review Controller,并使用 TempData[] 将相同的模型对象传递给它。
  2. 您的审核控制器将提供一个视图来显示模型对象的内容。在该视图上实现一个编辑链接,该链接将调用创建控制器。您将需要某种方法将相同的模型传递回创建控制器。您可能可以使用 TempData[] 或 Session veriable 来执行此操作。我认为您不能传递复杂的对象,即使用 ActionLink 帮助器的模型。
  3. Create Cronroller Httpost Action 将获取模型并提供视图供用户编辑数据。

【讨论】:

  • 您不能在重定向中传递模型。但是,您可以从回发中返回编辑视图。
  • 是的,我有 6 个字段的视图模型。你能用这个例子解释一下,比如如何在同一个控制器中将 viewmodel 对象从创建活动传递到审查操作,以及从审查到编辑(使用填充信息创建)。
  • @updev TempData[] 或 Session 变量应该在我的脑海中发挥作用。可能还有其他方法。
  • 好的,我得到了与创建相同模型的评论页面,因为我正在从创建重定向到评论,返回 RedirectToAction("Review", myViewModel);现在我怎样才能返回使用评论页面中的编辑按钮创建页面并填充信息,意味着使用相同的模型对象?
  • @updev 好的,你的编辑按钮,在你的审查控制器上调用一个动作。 Review 控制器会将模型保存到 TempData[] 中,然后重定向到 Create 控制器操作,该操作将从 TempData[] 获取模型并显示带有模型的创建视图。我认为这应该可行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
相关资源
最近更新 更多