2015-12-06 3 views
2

Я столкнулся с проблемой при привязке модели с двумя таблицами в одном классе. Форма не является обязательными для модели при отправке ее на контроллер.Связывание двух таблиц в модели - ASP.NET MVC Razor

Модель:

public class BasicProfileModel { 
    public BasicProfileModel() { 
     this.user = new User(); 
     this.basicProfile = new BasicProfile(); 
    } 
    public User user { get; set; } 
    public BasicProfile basicProfile { get; set; }   
} 

пользователей и Basic Profile классы две таблицы со следующими свойствами:

public class User { 
    public string UserId { get; set; }//not null and PK 
    public string EmailId { get; set; }//no null 
    public string Salt { get; set; }//not null 
    public string Password { get; set; }//not null 
    public string Role { get; set; }//not null 
    public bool HasCompleteProfile { get; set; }//not null 
} 

public class BasicProfile { 
    public string UserId { get; set; }//not null FK 
    public string FirstName { get; set; }//not null 
    public string LastName { get; set; } 
    public string Gender { get; set; }//not null 
    public int YearOfBirth { get; set; }//not null 
    public bool IsApprovedByUser { get; set; }//not null 
    public bool IsApprovedByAdmin { get; set; }//not null 
    public bool IsActiveByUser { get; set; }//not null 
    public bool isActiveByAdmin { get; set; }//not null 
} 

Когда я загрузить вид модели показывает любое значение инициализируется в контроллере (который генерирует вид) или в в верхней части окна просмотра C#. Но когда я отправляю форму, контроллер показывает модель без какой-либо ценности. Когда я создаю контроллеры/представления для одной таблицы, то все отлично работает. Вот код для методов действий контроллера и просмотра.

public ActionResult BasicRegister() { 
     BasicProfileModel model = new BasicProfileModel(); 

     //any value initialised in model here displays in view elements e.g. text boxes. 
     return View("BasicRegister", model); 
    } 

    [HttpPost] 
    public ActionResult DoBasicRegister(BasicProfileModel basicProfile) { 
     return View("BasicRegister", basicProfile); 
    } 

// Это вид

@model BasicProfileModel 


@using (Html.BeginRouteForm("DoBasicRegister", FormMethod.Post)) { 
<div> 
    @Html.TextBoxFor(m => m.user.EmailId) 
</div> 
<div> 
    @Html.TextBoxFor(m => m.user.Password) 
</div> 
<div> 
    @Html.TextBoxFor(m => m.basicProfile.FirstName) 
</div> 

<div> 
    @Html.TextBoxFor(m => m.basicProfile.LastName) 
</div> 
<div> 
    <input type="submit" value="send" /> 
</div> 

}

// Маршруты

routes.MapRoute(
      name: "BasicRegister", 
      url: "join", 
      defaults: new { controller = "Home", action = "BasicRegister" } 
      ); 

     routes.MapRoute(
      name: "DoBasicRegister", 
      url: "dojoin", 
      defaults: new { controller = "Home", action = "DoBasicRegister" } 
      ); 
+0

Как связаться с пользователем и базовым профилем? Похоже, что вам не хватает отношения один к одному. – Anonymous

+0

Пользователь имеет UserId как PK, а BasicProfile имеет UserId как FK. Отношения один к одному. Использование Linq в sql. – nicejani80

+0

Я думаю, что меня просто смущает тот факт, что в BasicProfile нет публичного пользователя User {get; set;}. Я не говорю, что это должно быть так. Но я так и делаю. :) Я бы подумал, что если вы захотите также показать отношения в классах. – Anonymous

ответ

1

Ваша модель null потому, что ваша модель имеет свойство с именем basicProfile и ваш метод POST имеет параметр с тем же именем.

Изменить имя параметра в методе (скажем)

[HttpPost] 
public ActionResult DoBasicRegister(BasicProfileModel model) { 

и модель будет правильно связаны.

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

+0

Это работает. Спасибо – nicejani80

0

Маршрут настроен неправильно. Я полагаю, что если вы сможете правильно настроить маршрут, он будет работать. Попробуйте маршруты ниже

routes.MapRoute(
      name: "BasicRegister", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "BasicRegister", id = UrlParameter.Optional } 
      ); 

     routes.MapRoute(
      name: "DoBasicRegister", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "DoBasicRegister" , id = UrlParameter.Optional} 
      ); 
+0

Маршрут в порядке, ответ Стивена Муекке исправил проблему. – nicejani80

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