Свойства View Model не установлены на HttpPost

My View Код модели:

public class Step2ViewModel : MultiStepBaseViewModel
{
    public IList<LayoutDetail> LayoutConfig { get; set; }
}

Мой код просмотра:

@model eliteemail.Web.Mvc.Areas.Emails.ViewModels.Step2ViewModel
@{
    ViewBag.Title = "Layout";
    Layout = "~/Views/Shared/_HomeLayout.cshtml";
}

@using (Html.BeginForm())
{

    @Html.ValidationSummary(true)

    for (int i = 0; i < @Model.LayoutConfig.Count(); i++)
    {
    <div class="grid_3 tcenter">
        <div class="divhighlight">
            <div style="width: 165px; margin: 6px auto 4px auto;" class="f16 bold tcenter" id="helptrigger1">@Model.LayoutConfig[i].LayoutTitle</div>
            <a class="fancybox" rel="layouts" href="@Model.LayoutConfig[i].LayoutImgPrev" title="1 Column">
                <img src="@Model.LayoutConfig[i].LayoutImg" alt="1 Column" width="189" height="227" vspace="5" />
            </a>
            <div style="width:189px; margin:auto">
                <input type="submit" class="button gobutton" style="margin-right: 40px; width: 165px;" value="Select" name="@Model.LayoutConfig[i].LayoutID,@Model.LayoutConfig[i].LayoutTitle"/>
            </div>
        </div>
    </div>
    } 
}

Код моего контроллера:

public ActionResult Step2()
{
    Step2BusinessLogic step2BusinessLogic = new Step2BusinessLogic();
    Step2ViewModel step2ViewModel = step2BusinessLogic.CreateStep2ViewModel();
    return View(step2ViewModel);
}

[HttpPost]
public ActionResult Step2(Step2ViewModel step2ViewModel)
{
    ....
}

Код Класса Моей Бизнес Логики:

public class Step2BusinessLogic
{
    public Step2ViewModel CreateStep2ViewModel(string Id)
    {
        Step2ViewModel step2ViewModel = new Step2ViewModel();
        step2ViewModel.MultiStepId = new Guid(Id);
        step2ViewModel.LayoutConfig = GetLayout();
        return createEmailStep2ViewModel;
    }

    public List<LayoutDetail> GetLayout()
    {
        List<LayoutDetail> layoutList = new List<LayoutDetail>();

        LayoutDetail layout1 = new LayoutDetail();
        layout1.LayoutID = 1;
        layout1.LayoutTitle = "1 Column";
        layout1.LayoutImg = "~/img/create/layout/layout-1.png";
        layout1.LayoutImgPrev = "img/create/layout/layout-1-preview.png";
        layoutList.Add(layout1);

        LayoutDetail layout2 = new LayoutDetail();
        layout2.LayoutID = 2;
        layout2.LayoutTitle = "1:2 Column";
        layout2.LayoutImg = "~/img/create/layout/layout-2.png";
        layout2.LayoutImgPrev = "img/create/layout/layout-2-preview.png";
        layoutList.Add(layout2);

        .........(12 Items)

        return layoutList;
    }
}

public class LayoutDetail
{
    public int LayoutID { get; set; }

    public string LayoutTitle { get; set; }

    public string LayoutImg { get; set; }

    public string LayoutImgPrev { get; set; }
}

Проблема в том, что когда я отправляю из Step2View.cshtml, затем

public ActionResult Step2(Step2ViewModel step2ViewModel)

называется, но свойства step2ViewModel не устанавливаются и ModelState.IsValid возвращает ложь. Я хочу избежать обоих условий. Любая помощь, пожалуйста, так как я очень новичок в MVC.

Я искал несколько ссылок, но не могу понять сценарий.

2 ответа

Проблема в том, что вы ничего не отправляете, когда делаете сообщение. У вас нет элементов формы, кроме кнопки. Если у вас есть элементы формы, данные будут переданы обратно. Попробуйте добавить @Html.HiddenFor(o=>o.LayoutID) по вашему мнению, а затем отправлять снова. Форма будет публиковать скрытые элементы или поля формы, но не будет отображать только поля, как вы делаете.

Не используйте foreach Цикл на объекте коллекции, поскольку связыватель модели не может работать с ним. Использовать for-loop вместо. В вашем коде заменить каждый случай @item с @Model.LayoutConfig[i]см. обновленный код ниже:

for(var i=0;i<@Model.LayoutConfig.Count();i++)
{
    <div class="grid_3 tcenter">
        <div class="divhighlight">
            <div style="width: 165px; margin: 6px auto 4px auto;" class="f16 bold tcenter" id="helptrigger1">@Model.LayoutConfig[i].LayoutTitle</div>
            <a class="fancybox" rel="layouts" href="@Model.LayoutConfig[i].LayoutImgPrev" title="1 Column">
                <img src=@Model.LayoutConfig[i].LayoutImg" alt="1 Column" width="189" height="227" vspace="5" />
            </a>
            <div style="width:189px; margin:auto">
                <input type="submit" class="button gobutton" style="margin-right: 40px; width: 165px;" value="Select" name="@Model.LayoutConfig[i].LayoutID, @Model.LayoutConfig[i].LayoutTitle"/>
            </div>
        </div>
    </div>
}
Другие вопросы по тегам