1

Хотя я считаю, что все модели определены и, надеюсь, прошли правильно, но я получаю сообщение об ошибке, в котором говорится, что я прохожу в одной модели, когда ей требуется другая модель.Передача нескольких моделей в одном представлении

Главная Вид:

@model Project.Models.ProfileModel 

@(ViewBag.HasLocalPassword ? Html.Partial("_ChangePasswordPartial", Model.PasswordModel) : Html.Partial("_SetPasswordPartial", Model.PasswordModel)) 

      @Html.Partial("_UsernamePartial", Model.UsernameModel) 
      @Html.Partial("_PlayNamePartial", Model.PlayNameModel) 

Модели:

public class ProfileModel 
{ 
    public PasswordModel PasswordModel { get; set; } 
    public PlayNameModel PlayNameModel { get; set; } 
    public UsernameModel UsernameModel { get; set; } 
} 

UserName Действие GET:

public ActionResult _UsernamePartial() 
    { 
     var usernameModel = new UsernameModel(); 
     using (var db = new DataContext()) 
     { 
      usernameModel.Username = 
       (from u in db.Users where u.ID == WebSecurity.CurrentUserId select u.Username).FirstOrDefault(); 
     } 
     return PartialView(usernameModel); 
    } 

UserName POST Действие:

[HttpPost] 
    public ActionResult _UsernamePartial(UsernameModel usernameModel) 
    { 
     if (ModelState.IsValid) 
     { 
      using (var db = new DataContext()) 
      { 
       User user = db.Users.FirstOrDefault(u => u.ID == WebSecurity.CurrentUserId); 
       user.Username = usernameModel.Username; 
       db.SaveChanges(); 
      } 
     } 
     return View("_UsernamePartial"); 
    } 

Профиль Действие:

public ActionResult Profile(ManageMessageId? message) 
    { 
     var profile = New ProfileModel(); 
     ViewBag.StatusMessage = 
      message == ManageMessageId.ChangePasswordSuccess ? "Your password has been changed." 
      : message == ManageMessageId.SetPasswordSuccess ? "Your password has been set." 
      : message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed." 
      : ""; 
     ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name)); 
     ViewBag.ReturnUrl = Url.Action("Profile"); 
     return View(profile); 


    } 

Просмотр Страница UserName:

@model Acatar.Models.UsernameModel 

@using (Html.BeginForm("_UsernamePartial", "Account")) { 

     <p id="legend">Username</p> 
     @Html.TextBoxFor(m=>m.Username) 

    <button type="submit" value=" Username">Save</button> 
} 

Сообщение об ошибке:The model item passed into the dictionary is of type 'Project.Models.ProfileModel', but this dictionary requires a model item of type 'Project.Models.UsernameModel'.

бы очень признателен за любую помощь, где я буду неправильно.

+0

на какую страницу просмотра вы действительно видите эту ошибку? – bot

+0

@bot на главной странице просмотра - первый раздел кода, который у меня есть. Должен ли я передавать все GETS для трех моделей в один метод GET на странице профиля? – BB987

+0

@ BB987, нет, вам не нужно публиковать сообщения всех пользователей на той же странице. интересно, у вас есть дочерний метод для _UsernamePartial, который никогда не используется. не связанные с вашей проблемой, но интересные –

ответ

0

Если вы звоните Html.Partial я не верю, что он вызывает метод действия , Вы должны использовать Html.RenderAction(), который будет вызывать действие контроллера.

+0

Я не думаю, что это было @ BB987 намерение использовать его частичные действия с Child Actions. Я мог ошибаться, но я думаю, что его намерение состояло в том, чтобы опубликованные формы были опубликованы в Actions, названные в честь их соответствующих представлений. Это было бы непониманием новичком конвенции. Я думаю ... –

+0

Хорошо, поэтому я понял это правильно - я буду использовать Html.RenderAction() в профиле (основной вид)? – BB987

+1

Это не решит все ваши проблемы. Вы не должны публиковать свою форму в _UsernamePartial, если она не возвращает имя пользователяModel. Этот метод будет «привязан» к вашим частичным и будет пытаться его отобразить. Но ваш частичный ожидает модель типа usernameModel. –

1

Когда вы отправляете сообщение _UsernamePartial, это действует как метод дочернего действия, который возвращает другой Partial. Вы передаете назад

Вы эффективно передавая назад View _UsernamePartial но возвращение его

return View("_UsernamePartial"); 

без usernameModel

+1

@ BB987, прочитайте это сообщение о частичных и дочерних действиях, он должен прояснить много http: //www.arrangeactassert.com/when-to-use-html-renderpartial-and-html-renderaction-in-asp-net-mvc-razor-views/ –

Смежные вопросы