2010-08-10 2 views
4

Должен быть простой вопрос для ответа. Я пытаюсь создать объект в представлении. Класс, содержащий объект, состоит из класса User и пароля. Когда я нажимаю кнопку отправки, контроллер выбирает нулевые значения для пароля и пользователя. См. Ниже класс Контейнер, контроллер и вид;Создать объект для публикации 0 объектов

public class UserExtended 
{ 
    public UserITOC User { get; set; } 
    public string Password { get; set; } 
} 

    [Authorize] 
    public ActionResult Create() 
    { 
     return View(new UserExtended()); 
    } 

    // 
    // POST: /Dinners/Create 

    [Authorize(Roles = "Administrator")] 
    [HttpPost] 
    public ActionResult Create(UserExtended user) 
    { 
     if (ModelState.IsValid) 
     { 
      // Create user in the User datatable 
      SqlUsersRepository sqlRepository = new SqlUsersRepository(); 
      ITOCEntities db = new ITOCEntities(); 
      db.UserITOCs.AddObject(user.User); 

      // Create user as an authenticated user within the Reader role. 
      int i = user.User.EmailAddress.IndexOf('@') - 1; 
      string userName = user.User.EmailAddress.Substring(0, i); 
      string email = user.User.EmailAddress; 
      Membership.CreateUser(userName, user.Password, email); 
      Roles.AddUserToRole(userName, "Reader");    // Automatically assigned as a Reader 
     } 
     return View(new UserExtended()); 
    } 
"%>

Создать

<h2>Create</h2> 

<% using (Html.BeginForm()) {%> 
    <%: Html.ValidationSummary(true) %> 

    <fieldset> 
     <legend>Fields</legend> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.User.Forename) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.EditorFor(model => model.User.Forename)%> 
      <%: Html.ValidationMessageFor(model => model.User.Forename)%> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.User.Surname) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.EditorFor(model => model.User.Surname)%> 
      <%: Html.ValidationMessageFor(model => model.User.Surname)%> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.User.EmailAddress) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.EditorFor(model => model.User.EmailAddress)%> 
      <%: Html.ValidationMessageFor(model => model.User.EmailAddress)%> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.Password) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.EditorFor(model => model.Password)%> 
      <%: Html.ValidationMessageFor(model => model.Password) %> 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

<div> 
    <%: Html.ActionLink("Back to List", "Index") %> 
</div> 

ответ

12

Чрезвычайно простое решение:

Изменить ваши действия подписи от

public ActionResult Create(UserExtended user) 

к

public ActionResult Create(UserExtended UserExtended) 

Таким образом ModelBinder будет знать, как собрать объект из запроса.

Надеюсь, это поможет!

+1

Фантастический! Я думал, что ответ будет легким, но это одна из тех ошибок, которые вы должны сделать при изучении MVC, ИМХО. – arame3333

+1

Так правда :) Рад, что я мог бы помочь! –

+0

У меня была такая же проблема и за последние 3 месяца! Не мог поверить, было так просто! Ха-ха! Благодаря! – BrunoSalvino

0

вы возвращаете новый экземпляр класса UserExtended

return View (новый UserExtended());

вместо этого возвращают объект, который вы получаете в качестве параметра

возвращение пользователя

+0

Это на самом деле не имеет ничего общего с тем, что экземпляр он получает в действие значение null ... –

+0

Yngvebn верный – arame3333

+0

@ arame3333 Вы попробовали просто вернуть пользователя var –

3

У меня была очень похожая проблема, но нашел в моем случае, когда я должен был совпадать с именем таблицы базы данных, а не имя типа

  • Имя типа: NonTradingDay
  • базы данных имя таблицы: dbo.NonTradingDays (был множественным)

Создать метод:

[HttpPost] 
public ActionResult Create(NonTradingDay NonTradingDays) 
{ 
    if (ModelState.IsValid) 
    { 
     db.NonTradingDay.Add(NonTradingDays); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(NonTradingDays); 
} 

Я пробовал «NonTradingDay», но все еще получил нуль; Затем я просмотрел имя таблицы базы данных, попробовал «NonTradingDays» и было выполнено сопоставление (аргумент больше не был нулевым).

Я думаю это потому, что я имел контекст базы данных как:

public DbSet<NonTradingDay> NonTradingDay { get; set; } 

Вместо того:

public DbSet<NonTradingDay> NonTradingDays { get; set; } 
Смежные вопросы