2016-09-18 2 views
0

У меня есть класс POCO с этим определениемМодели Связывание в MVC основного выпуска

public class IndOff 
{ 
    public int Id { get; set; } 

    [Display(Name = "Member Name")] 
    [Required] 
    public int MemberID { get; set; } 
    public OfferingType OfferingType { get; set; } 
    [Display(Name = "Offering Type")] 
    [Required] 
    public int OfferingTypeID { get; set; } 

    public Currency Currency { get; set; } 
    [Display(Name = "Currency")] 
    [Required] 
    public int CurrencyID { get; set; } 
    public Member Member { get; set; } 

    public double Amount { get; set; } 
    public DateTime Date { get; set; } 

} 

Тогда я определил вид модель в этом классе, как

public class IndOffViewModel 
{ 
    public IndOffViewModel() 
    { 

    } 
    public IEnumerable<Currency> Currencies { get; set; } 
    public IEnumerable<OfferingType> OfferingTypes { get; set; } 
    public Member Member { get; set; } 
    public IndOff IndOff { get; set; } 
} 

Из моего контроллера, вид для сбора данных отображается правильно, проблема возникает, когда я отправляю данные. Мой пост действие

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Save(IndOff model, int memberId) 
    { 
     model.Date = DateTime.Today; 
     if (!ModelState.IsValid) 
     { 
      var member = _context.Members.Single(m => m.Id == memberId); 
      var viewModel = new IndOffViewModel 
      { 
       Member = member, 
       Currencies = _context.Currencies.ToList(), 
       OfferingTypes = _context.OfferingTypes.ToList() 
      }; 
      return View("IndForm", viewModel); 
     } 
     if (model.Id == 0) 
      _context.IndOffs.Add(model); 
     else 
     { 
      var dbIndOff = _context.IndOffs.Single(c => c.Id == model.Id); 
      dbIndOff.Amount = model.Amount; 
      dbIndOff.CurrencyID = model.CurrencyID; 
      dbIndOff.OfferingTypeID = model.OfferingTypeID; 
      //dbIndOff.WorshipCenterID = weekOff.WorshipCenterID; 
     } 
     _context.SaveChanges(); 
     return RedirectToAction("New", new { id = model.Id}); 
    } 

Однако IndOff модель объекта передается всегда пустой нулями для свойств. Хотя, когда я использую инспектор хрома, я вижу, что значения были переданы контроллеру. В чем проблема или что я делаю неправильно? Вот как выглядит страница вида

@model ViewModels.IndOffViewModel 
@{ 
    ViewBag.Title = "Offering"; 
} 
<form asp-action="Save" method="post"> 
<div asp-validation-summary="All" class="text-danger"></div> 
<div class="form-group"> 
    <label asp-for="IndOff.OfferingTypeID" class="control-label"></label> 
    <select asp-for="IndOff.OfferingTypeID" asp-items="@(new SelectList(Model.OfferingTypes,"ID","Name"))" class="form-control"> 
     <option value="">-Select-</option> 
    </select> 
    <span asp-validation-for="IndOff.OfferingTypeID" class="text-danger" /> 
</div> 
<div class="form-group"> 
    <label asp-for="IndOff.CurrencyID" class="control-label"></label> 
    <select asp-for="IndOff.CurrencyID" asp-items="@(new SelectList(Model.Currencies,"Id","Name"))" class="form-control"> 
     <option value="">-Select-</option> 
    </select> 
    <span asp-validation-for="IndOff.CurrencyID" class="text-danger" /> 
</div> 
<div class="form-group"> 
    <label asp-for="IndOff.Amount" class="control-label"></label> 
    <input asp-for="IndOff.Amount" class="form-control" /> 
    <span asp-validation-for="IndOff.Amount" class="text-danger" /> 
</div> 
@*<div class="checkbox"> 
    <label> 
     <input asp-for="Member.Baptised" /> 
     Baptised ? 
    </label> 
</div>*@ 
<input type="hidden" asp-for="IndOff.Id" /> 
<input type="hidden" asp-for="Member.Id" name="memberId" /> 
<input type="submit" value="Submit" class="btn btn-primary" /> 
</form> 

@section Scripts { 
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} 
} 
+0

я думаю, что проблема в том, что MemberId не является частью модели – user230910

+0

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

+0

Вам нужно показать свое мнение! –

ответ

0

Поскольку класс IndOff содержится внутри IndOffViewModel, вам необходимо указать действие «подсказка» о том, где начать искать, используя атрибут Bind. Как так:

public ActionResult Save([Bind(Prefix="IndOff")]IndOff model, int memberId) 
+0

Большое спасибо, добавив префикс, он работает Теперь. Тем не менее, я все еще хочу спросить, почему мои другие режимы просмотра и сохранения работают из коробки, но мне нужно было добавить это. Есть несколько других подобных моделей. Все они работают без Bind. Не могли бы вы объяснить мне это? – Tonto

+0

Буду рад, однако я не уверен, что мы можем поместить всю эту информацию в раздел комментариев :). Вы хотите обновить свой вопрос этими примерами?Кроме того, вы можете создать другой вопрос и сообщить мне. –

+0

Пожалуйста, взгляните на этот [вопрос] (http://stackoverflow.com/questions/39579183/model-binding-in-mvc-core) – Tonto

0

Вы используете свою ViewModel для сгенерирования вашей формы? В этом случае привязка не будет работать, потому что путь к правилу не соответствует.

Идентификатор тега html input будет «IndOff. {FieldName}».

Но ваш контроллер принимает IndOff, а не IndOffViewModel в качестве параметра. Затем путь к свойствам IndOff «{fieldnName}».

Чтобы решить эту проблему, ваш ViewModel может расширять IndOff вместо того, чтобы содержать свойство IndOff.

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