2016-04-14 71 views
-3

我有一个页面,其中有2个文本框用户单击注册按钮后名字和姓氏将运行并返回用户信息并显示另一个页面(视图)用户电话,电子邮件,..填写API返回的信息。我有1个控制器和2个视图。 我从API获取信息并返回第二个视图,但不知道如何用我拥有的信息填充文本框。问题在于使用模型,每个视图有两个模型。我在调用第二个视图时出现此错误:在MVC中将数据从一种控制器方法传递到另一种方法

传入字典的模型项类型为'System.Collections.Generic.Dictionary`2 [System.String,System.Object]',但是此字典需要Model.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(); 
    } 

这是我的第一个观点,即显示两个文本框:

@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; } 
    .... 
    } 
+0

错误消息很有用。你需要告诉'JavascriptSerializer'什么'类型'你是反序列化。应该有一个'Deserialize()'方法的通用版本。 – PeteGO

+0

我想你也想'返回RedirectToAction('Create',userObject)'。使用'return View(...)'不会首先转到另一个控制器方法。 – PeteGO

回答

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(); 
} 
0

Controller,您可以创建Models.CreateLogInRequest模型的新实例,并填写相关属性从第一个View收到。如果Models.CreateLogInRequest不包含此类属性,则最好通过在从第一个视图检索到的Controller中使用TempDataViewBag并将它们传递到第二个视图来加载这些值。对于ViewBag,ViewData或TempData之间的区别,您可能会看到When to use ViewBag, ViewData, or TempData in ASP.NET MVC 3 applications。希望这有助于...

相关问题