2013-10-06 2 views
1

У меня возникли проблемы с моим приложением. Когда пользователь динамически добавляет строки (javascript), чтобы добавить больше «претензий» к «требованию», значения «Отправлять» не отображаются, только значения «фиктивные», которые я изначально устанавливал в ViewModel, в первую очередь. Таким образом, в принципе все, что пользователь исправляет или действительно добавляет (новые строки), не записывается в POST.Правильная передача viewmodel - изменения не отображаются на POST

Насколько я могу судить, я просматриваю ViewModel между контроллером и представлениями, но, очевидно, что-то не хватает. Я боролся с этим какое-то время, ваша помощь была бы чрезвычайно оценена. Я новичок в ASP.NET MVC и вообще программирует в целом. Я слежу за блогом Стивена Сандерсона.

ViewModel

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using ef_tut.Models; 
using ef_tut.ViewModels; 
namespace ef_tut.ViewModels 
{ 
    public class ClaimViewModel 
    { 
     public int ClaimID { get; set; } 
     public int SubmissionUserID { get; set; } 
     public DateTime? DateSubmitted { get; set; } 
     public bool ApprovedYN { get; set; } 
     public DateTime? DateApproved { get; set; } 

     public ICollection<claimline> claimlines { get; set; } 

    } 
} 

Контроллер

using System; 
    using System.Collections.Generic; 
    using System.Data; 
    using System.Data.Entity; 
    using System.Linq; 
    using System.Web; 
    using System.Web.Mvc; 
    using ef_tut.Models; 
    using ef_tut.DAL; 
    using ef_tut.ViewModels; 
    using ef_tut.WebUI.Helpers; 
    namespace ef_tut.Controllers 
    { 
     public class ClaimsController : Controller 
     { 
      private ClaimContext db = new ClaimContext(); 

      private static ClaimViewModel _currentclaim; 
      private static ClaimViewModel Currentclaim 
      { 
       get 
       { 
        _currentclaim = GetClaimViewModel(); 
        return _currentclaim; 
       } 
       set 
       { 
        _currentclaim = value; 
       } 
      } 

      public static ClaimViewModel GetClaimViewModel() 
      { 
       return new ClaimViewModel() 
      { 
       ClaimID =101, 
       claimlines = new List<claimline>() { 
         new claimline() {ClaimantUserID =1}, 
         new claimline() {ClaimantUserID =2}, 
         new claimline() {ClaimantUserID =3} 
        } 
      };} 

      public ActionResult Create() 
      { 
       return View(Currentclaim); 
      } 

      public PartialViewResult BlankEditorRow() 
      { 


       return PartialView("NewRow"); 
      } 

      [HttpPost] 
      public ActionResult Create(ClaimViewModel ClaimViewModel) 
      { 
       Currentclaim = ClaimViewModel; 

       return View("View2", Currentclaim); 
      } 
     } 
    } 

Создать Просмотр

@model ef_tut.ViewModels.ClaimViewModel 
@using ef_tut.Models 
@using ef_tut.ViewModels 
@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>claim</legend> 
         @Html.HiddenFor(model => model.ClaimID) 

     <ul id="editorRows"> 


          @foreach (claimline claimline in Model.claimlines) 
          { 
           Html.RenderPartial("NewRow", claimline); 
       } 

     </ul> 


     <p> 
       @Html.ActionLink("Add another...", "BlankEditorRow", null, new { id = "addItem" }) 

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



@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
} 

Частичное

@model ef_tut.Models.claimline 

@using ef_tut.WebUI.Helpers 
    @using (Html.BeginCollectionItem("claims")) 
    { 
     <table class="editorRow"> 
    <tr > 

                <td> 
      ClaimID(claimlinetable)@Html.EditorFor(model => model.ClaimID) 
      </td> 

     <td> 
      ClaimantUserID: @Html.EditorFor(model => model.ClaimantUserID) 
      </td> 
           <td> 
      Hours: @Html.EditorFor(model => model.Hours) 
      </td> 
                  <td> 
      <a href="#" class="deleteRow">delete</a> 
      </td> 
       </tr></table> 
    } 

вид Выходной

@model ef_tut.ViewModels.ClaimViewModel 
@using ef_tut.Models 

@{ 
    ViewBag.Title = "View2"; 
} 

<h2>View1</h2> 

@Html.HiddenFor(model=>model.ClaimID) 
    <ul> 
     @foreach (claimline claimline in Model.claimlines){ 
      @claimline.ClaimantUserID; } 
    </ul> 
+0

Параметр 'Currentclaim' геттер свойство, кажется, всегда назначался фиктивную модель представления претензии к частной переменной, которая получает returnes. – defrost

+0

Я попытался удалить эту ссылку на Currentclaim, тем самым пропустив в ClaimViewModel, но кажется, что ClaimViewModel имеет значение NULL. – mattbloke

+0

Вы все еще видите 1,2,3 фиктивные строки претензии? Это будет означать, что код все еще используется. В противном случае, что вы получаете? – defrost

ответ

1

Вы должны использовать помощник BeginCollectionItem с параметром CollectionName равным имени коллекции в модели представления (claimlines). Это потому, что этот помощник заменить HtmlFieldPrefix и имена, сгенерированные для HTML полей: specified_collection_name [generated_index] .claimline_property_name

Так что в вашем случае сгенерированные имена для входов, как: претензий [generated_index] .Hours

Но модель MVC связующее вещество не может найти претензию свойства в ClaimViewModel.

Если заменить @using (Html.BeginCollectionItem ("претензии")) с @using (Html.BeginCollectionItem ("claimlines")) генерируются имена входных будет как:

claimlines [generated_index] .Hours

и модель связующий будет генерировать ClaimViewModel, как вы ожидали

+0

спасибо, сэр. очень признателен – mattbloke

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