Модель не полностью обязательна в POST - PullRequest
1 голос
/ 10 ноября 2019

Не понимаю, что я наблюдаю здесь ... У меня есть модель, которую я отображаю в виде.

Это SubscriptionViewModel:

public Subscription Subscription { get; set; }

public DayOfWeek DayOfWeek { get; set; }

public List<DateTime> SomeDates { get; set; }

В представлении я заполнил таблицу данными из SubscriptionViewModel. В каждой строке таблицы есть оператор If / else, где в каждой части я поместил форму, чтобы данные могли быть отправлены обратно в SubscriptionController, это псевдо-пример:

if (condition)
{
    using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
    {
        @Html.ActionLink("text", "Subscribe", new { @date = item }, new { @class = "btn btn-warning btn-radius" })
    }
}
else
{
    using (Html.BeginForm("UnSubscribe", "Subscription", FormMethod.Post))
    {                                                                   
        @Html.ActionLink("text", "UnSubscribe", new { @date = item }, new { @class = "btn btn-danger btn-radius" })
    }
}

ЭтоСрабатывает метод SubscriptionContoller:

[AllowAnonymous]
public ActionResult Subscribe(SubscriptionViewModel model, string date)
{
    return View();
}

Запущен POST, и моя модель не равна NULL, параметр date также имеет правильное значение, единственное, что теряется, это параметры из Подписка Сущность из моей SubscriptionViewModel. Они не равны NULL, но у них просто нет начальных значений при первоначальном входе в View ...

Понятия не имею, что я наблюдаю, я пытался использовать TempData.Keep() в View (что мне никогда не требовалось)делать раньше) но это тоже не работает.

Любые предложения приветствуются! Спасибо!

1 Ответ

1 голос
/ 10 ноября 2019

В этом ответе предполагается, что вы не хотите, чтобы значения для подписки приходили из формы, а оставались такими же, какими они были, когда значения первоначально отправлялись в представление, которое звучит так, как вам нужно.

Вам необходимо включить значения для подписки в форму, используя скрытые поля (см. Пример 1). В качестве альтернативы вам нужно будет заполнить подписку в вашем методе post так же, как в вашем методе get (см. Пример 2).

Вот 2 простых примера, демонстрирующих, что я имею в виду

Предположим, это ваш класс подписки

public class Subscription
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Пример 1

Способ HiddenField

Контроллер

public class SubscriptionController : Controller
{       
    [AllowAnonymous]
    public ActionResult Subscribe()
    {
        var viewModel = new SubscriptionViewModel
        {
            Subscription = GetSubscription()
        };

        return View(viewModel);
    }

    [AllowAnonymous]
    [HttpPost]
    public ActionResult Subscribe(SubscriptionViewModel model, string date)
    {
        return View();
    }

    private Subscription GetSubscription()
    {
        return new Subscription
        {
            Id = 1,
            Name = "My Subscription"
        };
    }
}

Вид

@model {The namespace}.SubscriptionViewModel

@using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
{
    //Other fields 
    @Html.HiddenFor(x => x.Subscription.Id)
    @Html.HiddenFor(x => x.Subscription.Name)
    <input type="submit" value="submit" />
}

Пример 2

Возвращение в контроллер способом

Контроллер

public class SubscriptionController : Controller
{
    [AllowAnonymous]
    public ActionResult Subscribe()
    {
        var viewModel = new SubscriptionViewModel
        {
            Subscription = GetSubscription()
        };

        return View(viewModel);
    }

    [AllowAnonymous]
    [HttpPost]
    public ActionResult Subscribe(SubscriptionViewModel model, string date)
    {
        model.Subscription = GetSubscription();

        return View();
    }

    private Subscription GetSubscription()
    {
        return new Subscription
        {
            Id = 1,
            Name = "My Subscription"
        };
    }
}

Вид

@model {The namespace}.SubscriptionViewModel

@using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
{     
    //Other fields 
    <input type="submit" value="submit" />
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...