重定向后 - 在MVC3中获取问题

时间:2013-04-06 21:07:39

标签: asp.net-mvc-3

我需要使用Post-Redirect-Get显示数据,我在“索引”页面的“信息”页面中输入了数据。我有以下方法,但它不起作用。它甚至没有重定向我提交。我做错了什么?

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        return View();
    }

    public ActionResult Information()
    {
        return View();
    }

    //Get info
    [HttpGet]
    public ActionResult Submit(Models.Information FirstName,
                               Models.Information LastName,
                               Models.Information DateOfBirth,
                               Models.Information HourOfBirth,
                               Models.Information NumberOfKids,
                               Models.Information Emso,
                               Models.Information Email,
                               Models.Information PlaceOfBirth)
    {
        if (ModelState.IsValid)
        {
            Models.Information info = new Models.Information();

            info.FirstName = FirstName.ToString();
            info.LastName = LastName.ToString();
            info.DateOfBirth = Convert.ToDateTime(DateOfBirth);
            info.HourOfBirth = Convert.ToDateTime(HourOfBirth);
            info.NumberOfKids = Convert.ToInt32(NumberOfKids);
            info.Emso = Emso.ToString();
            info.Email = Email.ToString();
            info.PlaceOfBirth = PlaceOfBirth.ToString();

            TempData["info"] = info;

            return RedirectToAction("Summary");
        }

        return View();
    }

    //Show info
    [HttpPost]
    public ActionResult Post(Models.Information info)
    {
        info.FirstName = ViewData["FirstName"].ToString();
        info.LastName = ViewData["LastName"].ToString();
        info.DateOfBirth = Convert.ToDateTime(ViewData["DateOfBirth"]);
        info.HourOfBirth = Convert.ToDateTime(ViewData["HourOfBirth"]);
        info.NumberOfKids = Convert.ToInt32(ViewData["NumberOfKids"]);
        info.Emso = ViewData["Emso"].ToString();
        info.Email = ViewData["Email"].ToString();
        info.PlaceOfBirth = ViewData["PlaceOfBirth"].ToString();

        return View();
    }
}

我尝试在Index页面上显示数据:

 First name: <input type='text' runat="server" value="@ViewData["FirstName"]" /><br />

1 个答案:

答案 0 :(得分:4)

您的代码看起来有点令我困惑,我不确定您要完成的任务。但首先,让我们用一个例子来说明你想要实现的想法

  1. 用户输入有关信息操作/视图的信息
  2. (POST)将其发布到控制器/操作,然后验证模型并将其放入ViewData(REDIRECT TO STEP 3)
  3. (GET)您想在摘要页面上重新显示此数据。
  4. 根据这些假设,让我们稍微清理一下你的代码,利用ViewData和TempData对象,看看我们是否可以做到这一点。

    信息行动

    public ActionResult Information()
        {
            //In a strongly typed view, typically you would send an empty model
            //so the model binder/Html.Input helpers have something to bind to
            return View(new Models.Information());
        }
    

    用于处理传入数据的信息POST

    [HttpPost]
    public ActionResult Information(Models.Information info)
    {
        //Yup - you can use the same action name as the GET action above
        //You can name this anything you want, but I typically keep the same names so 
        //I know where the data came from
    
        //I think your assignments are backwards.  info came into the controller action
        //You want to save this as ViewData.  Also, let's do that in one line of code
        //And since we are redirecting, lets use the TempData dictionary
    
        //Notice the method type decorator above [HttpPost].  This is the P in PRG (Post)
    
    if(modelState.IsValid()){
        TempData["info"] = info;
    
        //Notice the name of the ActionMethod below.  The is the R in PRG (Redirect)
        return RedirectToAction("Summary");
    }
    
    //There were errors, lets send back to the Information view
    return View(info);
    

    }

    摘要行动

    public ActionResult Summary()
        {
            //We were redirected here, and this is a GET method.  This is the G in PRG
            //(GET)
    
            //lets go ahead and set the TempData stuff to a model, it just looks nicer on
            //the view
            var model = TempData["info"];
            return View(model);
        }
    

    至于观点,这里是每个人看起来很棒的片段

    信息查看

    @model Models.Information
    
    @{using(Html.BeginForm()){
       @Html.LabelFor(x=>x.FirstName)<br/>
       @Html.TextBoxFor(x=>x.Firstname)
    
       //Repeat for each property
    
       <input type="Submit" value="Submit"/>
    }}
    

    摘要视图

    @model Models.Information
    
       @Html.LabelFor(x=>x.FirstName)<br/>
       @Html.DisplayFor(x=>x.Firstname)
    
       //Repeat for each property