2016-04-14 22 views
-3

2 metin kutusuna sahip bir sayfam var. Kullanıcı adından sonra Ad ve Soyadı kaydol düğmesine tıkladığınızda API, kullanıcı bilgilerini çalıştırır ve döndürür ve başka bir sayfayı (görünümü) gösterir. kullanıcı Telefon, e-posta, .. Bu API'nın verdiği bilgi ile doldurun. 1 kontrolör ve 2 görünüm var. API'dan bilgi alıyorum ve ikinci görünümü döndürüyorum, ancak metin kutularını sahip olduğum bilgi ile nasıl doldurduğumu bilmiyorum. Sorun, modellerin görüşlerini kullanmaktır, her görünüm için bir tane modelim var. İkinci görünümü çağırdığımda bu hatayı alıyorum:MVC'de bir denetleyici yönteminden diğerine veri geçirme

Sözlüke aktarılan model öğesi 'System.Collections.Generic.Dictionary`2 [System.String, System.Object]' türündendir, ancak bu sözlük Model.CreateLogInRequest 'türünde bir model öğesi gerektirir.

@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"  /> 
    } 

ve bu 1. görünüm için benim modeldir:

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

bu 2 metin kutuları gösterir benim ilk Görünüm olduğunu

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

:

Bu

benim denetleyicisi olan Bu ikinci görünümdür:

@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" /> 
} 

ve bu görünüm için model geçerli: yorumlarımı bakın ve bu deneyin

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

Hata mesajı yararlıdır. "Type" ın hangi serileştirildiğini "JavascriptSerializer" 'e söylemeniz gerekir. Deserialize() yönteminin genel bir sürümü olmalıdır. – PeteGO

+0

Ben de RedirectToAction ('Create', userObject) 'döndürmek istediğinizi düşünüyorum. 'Return View (...)' seçeneğini kullanmak, önce başka bir denetleyici yöntemine gitmeyecektir. – PeteGO

cevap

0

: In

[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 sen Models.CreateLogInRequest modelinin yeni bir örneğini oluşturmak ve ilgili özellikler doldurabilir 1 View'dan alındı. Models.CreateLogInRequest, bu tür özellikleri içermiyorsa, bu değerleri, 1. Görünüm'den alınan Controller numaralı TempData veya kullanarak yüklemek ve bunları 2. Görünümüne iletmek daha iyidir. ViewBag, ViewData veya TempData arasındaki farklar için When to use ViewBag, ViewData, or TempData in ASP.NET MVC 3 applications'a bakabilirsiniz. Umarım bu yardımcı olur ...

İlgili konular