ASP.NET MVC после публикации Back List, содержащий свойство List в ViewModel, имеет значение null

1

Как я упоминал в заголовке после свойства Post Back List (MySalonTreatments) в ViewModel, значение null.

Я новичок в MVC, но думаю, что он должен работать. Модельное связующее знает, как обрабатывать сложные типы. Я много искал, но у меня нет решения. Может быть, вы могли бы указать мне на ошибки.

ViewModel:

public class CreateSalonViewModel
{
    public string Name { get; set; }

    [DataType(DataType.EmailAddress)]
    public string EmailAddress { get; set; }

    //it shouldn't be facebook adress
    public string Website { get; set; }

    public string MobilePhone { get; set; }

    public string LandlinePhone { get; set; }

    public int CityId { get; set; }

    public int ProvinceId { get; set; }

    public List<SalonTreatments> MySalonTreatments;
}

public class SalonTreatments
{
    public List<Treatment> SpecTypeTreaments { get; set; }
    public TreatmentType TreatmentType { get; set; }
}

контроллер:

public class SalonController : Controller
{
    private CrsDatabase db = new CrsDatabase();

    //
    // GET: /Salon/Create
    [Authorize]
    [HttpGet]
    public ActionResult Create()
    {
        return View(GetCreateSalonViewModel());
    }

    [Authorize]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(CreateSalonViewModel createSalonViewModel)
    {
        return View(createSalonViewModel);
    }

    #region service methods

    private CreateSalonViewModel GetCreateSalonViewModel()
    {
        CreateSalonViewModel createSalonViewModel = new CreateSalonViewModel();
        createSalonViewModel.MySalonTreatments = new List<SalonTreatments>();

        foreach (var treatmentType in db.TreatmentType)
        {
            var treatmentOfSpecType = db.Treatment.Where(t => t.TreatmentType.Id == treatmentType.Id).ToList();
            if (treatmentOfSpecType.Count > 0)
            {
                SalonTreatments salonTreatments = new SalonTreatments();
                salonTreatments.TreatmentType = treatmentType;
                salonTreatments.SpecTypeTreaments = treatmentOfSpecType;

                createSalonViewModel.MySalonTreatments.Add(salonTreatments);
            }
        }

        return createSalonViewModel;
    }

    #endregion
}

Посмотреть:

@model CRSWebsite.ViewModels.CreateSalonViewModel

@using (Html.BeginForm("Create", "Salon", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>CreateSalonViewModel</h4>
        <hr />
        @Html.ValidationSummary(true)
        <div class="form-group">
            @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name)
                @Html.ValidationMessageFor(model => model.Name)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.EmailAddress, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.EmailAddress)
                @Html.ValidationMessageFor(model => model.EmailAddress)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Website, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Website)
                @Html.ValidationMessageFor(model => model.Website)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.MobilePhone, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.MobilePhone)
                @Html.ValidationMessageFor(model => model.MobilePhone)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.LandlinePhone, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.LandlinePhone)
                @Html.ValidationMessageFor(model => model.LandlinePhone)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.CityId, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.CityId)
                @Html.ValidationMessageFor(model => model.CityId)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.ProvinceId, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ProvinceId)
                @Html.ValidationMessageFor(model => model.ProvinceId)
            </div>
        </div>

        @for (int i = 0; i < Model.MySalonTreatments.Count; i++)
        {
            <label>Zabiegi @Model.MySalonTreatments[i].TreatmentType.Name:</label>
            <div class="form-group">
                <div class="col-md-10">
                    @for (int j = 0; j < Model.MySalonTreatments[i].SpecTypeTreaments.Count; j++)
                    {
                        @Html.CheckBoxFor(m => m.MySalonTreatments[i].SpecTypeTreaments[j].IsSelected)
                        @Html.DisplayFor(m => m.MySalonTreatments[i].SpecTypeTreaments[j].Name)
                    }
                </div>
            </div>
        }
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

С уважением, Питер

  • 5
    Где ваше POST действие?
  • 0
    Тот факт, что вы использовали слова «отправлять сообщения назад», указывает на то, что вас могут использовать в мире веб-форм, где существовало Viewstate. Viewstate пытался решить проблему отсутствия состояний в Интернете, чего не делает ASP.NET MVC.
Показать ещё 2 комментария
Теги:
asp.net-mvc
asp.net-mvc-4

2 ответа

2
Лучший ответ

Наконец, я решил проблему!

Это была тривиальная проблема, в моем классе viewmodel CreateSalonViewModel я создал коллекцию обработки как:

public List<SalonTreatments> MySalonTreatments;

но по какой-то неизвестной причине модельное связующее не может справиться с этим. Правильный способ сделать это:

public List<SalonTreatments> MySalonTreatments { get; set; }

Спасибо за помощь!

  • 0
    Это не «неизвестная причина». Связыватель модели работает только с открытыми свойствами, вы не создали свойство, вы создали поле.
  • 0
    Конечно, это было «неизвестно» только для меня :-) Я многому научился у этого!
1

public ActionResult Create() - это метод GET для отображения вашей формы. Вам нужен другой метод, чтобы принять POST, и обязательно добавьте HttpGet к первому, чтобы MVC мог различать эти два. Также подтвердите, что ваша форма использует метод POSt для отправки формы:

[Authorize][HttpGet]
public ActionResult Create()
{
    return View(GetCreateSalonViewModel());
}

[HttpPost]
public ActionResult Create(CreateSalonViewModel model) 
{  // MVC will try to bind your POSTed form to parameters
...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню