2016-04-14 11 views
-3

ユーザーがサインアップボタンをクリックした後に2つのテキストボックス名と姓を持つページがあります。APIが実行され、ユーザー情報が返され、別のページ(ビュー)ユーザーの電話番号、電子メール、..それはAPIが返す情報で満たされます。私は1つのコントローラと2つのビューを持っています。 私はAPIから情報を取得し、2番目のビューを返しますが、私が持っている情報でテキストボックスをどのように埋めるかはわかりません。問題は、ビューでモデルを使用して、私は2つのモデルを各ビューごとに1つ持っています。MVCでコントローラメソッドから別のコントローラメソッドにデータを渡す

辞書に渡されるモデル項目の型が '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; } 
    } 

これは2番目のビューです。

@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'にあなたが脱直列化している' Type'を伝える必要があります。 'Deserialize()'メソッドのジェネリック版が存在するはずです。 – PeteGO

+0

私はあなたが 'RedirectToAction( 'Create'、userObject)'を返したいと思います。 'return View(...) 'を使うと、最初に他のコントローラメソッドに行くことはありません。 – PeteGO

答えて

0

私のコメントを参照してください。この試してください:あなたはModels.CreateLogInRequestモデルの新しいインスタンスを作成し、関連するプロパティを埋めることができController

[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

を1番目のViewから受信しました。 Models.CreateLogInRequestにそのようなプロパティが含まれていない場合は、Controllerの最初のビューから取得したTempDataまたはViewBagを使用してこれらの値をロードし、2番目のビューに渡す方が適切です。 ViewBag、ViewData、またはTempDataの違いについては、When to use ViewBag, ViewData, or TempData in ASP.NET MVC 3 applicationsをご覧ください。これが役立つことを願って...

関連する問題