在MVC中将数据从一个控制器方法传递到另一个控制器方法

时间:2016-04-14 21:13:14

标签: c# asp.net-mvc

我有一个页面有2个文本框名字和姓氏用户点击注册按钮API将运行并返回用户信息并显示另一个页面(视图)有用户电话,电子邮件,..填写API返回的信息。我有1个控制器和2个视图。 我从API获取信息并返回第二个视图但不确定如何用我拥有的信息填充文本框。问题是在视图中使用模型,每个视图我有2个模型。当我调用第二个视图时,我收到此错误:

传递到字典中的模型项的类型是' System.Collections.Generic.Dictionary`2 [System.String,System.Object]',但是这个字典需要一个Models类型的模型项.CreateLogInRequest'

这是我的控制者:

    [HttpGet]
    public ActionResult SearchUser()
    {           
        return View();
    }
    [HttpPost]
    public async Task<ActionResult> SearchUser(UserSearchRequest userSearchRequest)
    {
        HttpClient client = new HttpClient();
        object userObject = null;

        string baseUrl = "http://test/api/users";
        if (userSearchRequest.FirstName != null && userSearchRequest.LastName)
        {
            var response = await client.GetAsync(string.Format("{0}{1}/{2}/{3}", baseUrl, "/users", userSearchRequest.FirstName, userSearchRequest.LastName));

            if (response.IsSuccessStatusCode)
            {
                userObject = new JavaScriptSerializer().DeserializeObject(response.Content.ReadAsStringAsync().Result) as object;
            }
        }
        if (userObject != null)
        {
            return View("Create", userObject);
        }
        return View("Create", null);
    }

    [HttpPost]
    public ActionResult Create(CreateLogInRequest createLogInRequest)
    {

        return View();
    }

这是我的第一个显示2个文本框的视图:

  @using (Html.BeginForm("SearchUser", "SignUp", FormMethod.Post))
   {
 @Html.AntiForgeryToken()
<input id="FirstName" name="FirstName" type="text" placeholder="First NAME" />
<input id="LastName" name="LastName" type="text" placeholder="LastName " />
<input id="btnSubmit" name="btnSubmit" type="submit" value="SIGN UP TODAY"     />
   }

这是第一个视图的模型:

 public class UserSearchRequest
  {
    public string FirstName { get; set; }
    public string LastName { get; set; }
  }

这是第二个观点:

   @model Models.CreateLogInRequest

   @{
  ViewBag.Title = "Create";
}

 @using (Html.BeginForm("create", "SignUp", FormMethod.Post))
 {
   @Html.AntiForgeryToken()
   <input id="Email" name="Email" type="text" placeholder="Email"   value="@Model.Email" />
   <input id="Phone" name="Phone" type="text" placeholder="Phone"    value="@Model.Phone" />
   <input id="btnSubmit" name="btnSubmit" type="submit" value="CREATE ACCOUNT" />
 }

这是此视图的模型:

public class CreateLogInRequest
  {
    public string Email { get; set; }
    public string Phone { get; set; }
  ....
   }

2 个答案:

答案 0 :(得分:0)

请参阅我的评论并试一试:

[HttpGet]
public ActionResult SearchUser()
{           
    return View();
}

[HttpPost]
public async Task<ActionResult> SearchUser(UserSearchRequest userSearchRequest)
{
    HttpClient client = new HttpClient();
    CreateLogInRequest userObject = null;

    string baseUrl = "http://test/api/users";

    if (userSearchRequest.FirstName != null && userSearchRequest.LastName)
    {
        var response = await client.GetAsync(string.Format("{0}{1}/{2}/{3}", baseUrl, "/users", userSearchRequest.FirstName, userSearchRequest.LastName));

        if (response.IsSuccessStatusCode)
        {
            userObject = new JavaScriptSerializer().DeserializeObject<CreateLogInRequest>(response.Content.ReadAsStringAsync().Result);
        }
    }

    if (userObject != null)
    {
        return RedirectToAction("Create", userObject);
    }

    return View("Create", null);
}

[HttpPost]
public ActionResult Create(CreateLogInRequest createLogInRequest)
{
    return View();
}

答案 1 :(得分:0)

Controller中,您可以创建Models.CreateLogInRequest模型的新实例,并填写从第一个View收到的相关属性。如果Models.CreateLogInRequest不包含此类属性,则最好使用{1}}中的TempDataViewBag加载这些值,并将其传递给第2个视图。有关ViewBag,ViewData或TempData之间的差异,您可以查看When to use ViewBag, ViewData, or TempData in ASP.NET MVC 3 applications。希望这会有所帮助...