2013-05-06 2 views
0

У меня на самом деле нет хорошего примера для этого, главным образом потому, что я просто прикрываю его, и до сих пор мой код - это просто перепутанный мишень из gobble-dee-gook. Я в недоумении и нуждаюсь в помощи или совете по этому поводу. Вот что мне нужно:MVC4 Создание регистрационных страниц с использованием одной модели

Я создаю макет регистрационная форма предназначена только для учебных целей. В качестве примера я использовал форму заявки . На одной странице есть личная информация заявителя, такая как имя и фамилия, возраст, пол и уровень образования. Вторая страница позволяет им выбирать, на какую позицию они хотят подать заявку, и позволяет им предоставлять список навыков. У меня есть один model, настроенный на data и save до database. На первой странице будет ajaxследующая кнопка, которая заменяет форму первой страницы на вторую форму. На второй странице есть две кнопки, Назад и Отправить (достаточно простые), которые также являются ajax-y. Моя проблема прямо сейчас получает data из обеих форм, чтобы сохранить до entry в model. У кого-нибудь есть простой пример или ссылка, на которую я мог бы обратить внимание на такую ​​ситуацию? Или, может быть, еще один способ обойти это? Было бы очень полезно! :)

Модель

public int Id { get; set; } 

    [Required(ErrorMessage = "First name Req")] 
    [Display(Name = "First name")] 
    public string First { get; set; } 

    [Required(ErrorMessage = "Last name Req")] 
    [Display(Name = "Last name")] 
    public string Last { get; set; } 

    [Required(ErrorMessage = "Age Req")] 
    [Range(18, 75, ErrorMessage = "Age Range of {1}-{2}")] 
    public int Age { get; set; } 

    [Required(ErrorMessage = "Please Select Gender")] 
    public string Gender { get; set; } 

    [Required(ErrorMessage = "Education Level Req")] 
    public string Education { get; set; } 

    public string Position { get; set; } 

    public string Skills { get; set; } 

Контроллер

[HttpGet] 
    public PartialViewResult Apply1() 
    { 
     var model = db.Applications.Find(id); 
     if (model != null) 
     { 
      return PartialView("_Apply1", model); 
     } 
     return PartialView("_Apply1"); 
    } 

    [HttpPost] 
    public PartialViewResult Apply1(Application app) 
    { 
     if (Request.IsAjaxRequest()) 
     { 
      if (db.Applications.Where(a => a.First.ToLower() == app.First.ToLower() && a.Last.ToLower() == app.Last.ToLower() && a.Age == app.Age && a.Gender == app.Gender && a.Education == app.Education).Count() == 0) 
      { 
       app.Position = "x"; 
       db.Applications.Add(app); 
       db.SaveChanges(); 
      } 
      else 
      { 
       app = db.Applications.Single(a => a.First.ToLower() == app.First.ToLower() && a.Last.ToLower() == app.Last.ToLower() && a.Age == app.Age && a.Gender == app.Gender && a.Education == app.Education); 
      } 

      PosList(); //This is a helper Method, get's values for a dropdown list 
      id = app.Id; 
      var model = db.Applications.Find(id); 
      return PartialView("_Apply2", model); 
     } 

     return PartialView("_Apply1", app); 
    } 

    [HttpGet] 
    public PartialViewResult Apply2() 
    { 
     var model = db.Applications.Find(id); 
     if (model != null) 
     { 
      return PartialView("_Apply2", model); 
     } 
     return PartialView("_Apply2"); 
    } 

    [HttpPost] 
    public PartialViewResult Apply2(Application app) 
    { 


     if (ModelState.IsValid) 
     { 
      db.Entry(app).State = EntityState.Modified; 
      db.SaveChanges(); 
      ModelState.Clear(); 
      return PartialView("_Success"); 
     } 

     PosList(); 
     return PartialView("_Apply2", app); 
    } 

Первый взгляд

@model SiPrac.Models.Application 

@using (Ajax.BeginForm("Apply1", new AjaxOptions() 
{ 
InsertionMode = InsertionMode.Replace, 
UpdateTargetId = "appForm" 
})) 
{ 
@Html.AntiForgeryToken() 

<div class="editor-label"> 
    @Html.LabelFor(model => model.First) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.First) 
    @Html.ValidationMessageFor(model => model.First) 
</div> 
<div class="clear"></div> 

<div class="editor-label"> 
    @Html.LabelFor(model => model.Last) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.Last) 
    @Html.ValidationMessageFor(model => model.Last) 
</div> 
<div class="clear"> 

<input class="btn" type="submit" value="Next" /> 
} 

Second View

@using (Ajax.BeginForm("Apply2", new AjaxOptions() 
{ 
InsertionMode = InsertionMode.Replace, 
UpdateTargetId = "appForm" 
})) 
{ 
@Html.AntiForgeryToken() 

<div class="editor-label"> 
    @Html.LabelFor(model => model.Position) 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.Position, (IEnumerable<SelectListItem>)ViewData["selectPos"]) 
</div> 
<div class="clear"></div> 

<input class="btn" type="submit" value="Submit" /> 
} 
+0

Показать, что у вас есть, вы может включать одно поле из каждой формы, поэтому вам не нужно публиковать много кодов в своем вопросе. Кроме того, разместите модель, которая у вас есть. Но в основном вы можете передавать входные данные в модель через ajax. –

+0

Что я до сих пор добавил. – SiSan

+0

Вы сказали, что хотите передать все поля из двух форм, но здесь вы показываете два метода отправки. Итак, вы намерены передать все поля из двух форм на каждый из этих почтовых методов - не имеет смысла? –

ответ

1

Хорошо, я постараюсь сделать это как можно более коротким. Так если вы уже знаете, как переключаться между формами, так как я знаю, что вы основаны на ваш вопрос, и у вас есть формы, подобные этим:

<form id="form1"> 
    @Html.EditorFor(model => model.First) 
    // rest of the fields goes here 
</form> 
<form id="form2"> 
    @Html.EditorFor(model => model.Position) 
    // rest of the fields goes here 
    <button id="submitAll">Submit</button> 
</form> 

Это предполагает, что у вас есть кнопки для переключения вперед и назад взгляды. Кнопка submitAll запускает действие обратной передачи в метод контроллера и передать значение, как это:

function submitAllFields() { 
    var o = { 
     // list properties here similar to your model property name 
     // and assign values to them 
     First: $("#First").val(), 
     Position: $("#Position").val() 
    }; 
    $.post('@Url.Action("apply2")', { app: o }, function(result) { 
     // do something here 
    }); 
} 

тогда Вам нужен один способ, чтобы принять все входы:

[HttpPost] 
public PartialViewResult Apply2(Application app) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(app).State = EntityState.Modified; 
     db.SaveChanges(); 
     ModelState.Clear(); 
     return PartialView("_Success"); 
    } 
    // do something here 
} 
+0

Итак, быстрый вопрос, в примере, который вы указали, формы находятся на отдельных видах, не так ли? Я не уверен, что именно так я должен их настроить, я просто предположил, что они находятся на отдельных страницах. – SiSan

+0

Им не обязательно быть особенно, если у вас нет сотни полей. –

+0

Извините, но это был весь смысл моего упражнения. Наличие двух разных форм на одной странице достаточно просто, что я знаю, как работать. Но это не то, что здесь происходит. Я знаю, что на данный момент у меня нет кучи полей, но мне нужно научиться сохранять все данные из двух отдельных форм, которые находятся на двух отдельных страницах, в одну запись в базе данных. Модель содержит список тех полей, которые должны быть заполнены пользователем. Мне очень жаль, если я не объясню это достаточно хорошо в моем параграфе. D: – SiSan

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