Я не могу отправить мою модель в мой контроллер - PullRequest
1 голос
/ 20 марта 2012

У меня проблема с отправкой моей модели в мой контроллер. Я использую кнопку с AJAX, чтобы изменить страницу, но мне нужна модель, которая с первой страницы на вторую страницу. Я хотел бы отправить мою модель в мой контроллер, но она не работает.

Когда я захожу на страницу CreateAll, рендеринг частичного следования работает для отображения Step1, но если я нажимаю на step2, я бы хотел, чтобы mainModel для отправки в мой контроллер использовал частичное представление с подмоделью.

Моя модель:

public class CreateAllStep
{
    public CreateStep1 Step1 { get; set; }
    public CreateStep2 Step2 { get; set; }
    public CreateAllStep(CreateStep1 step1, CreateStep2 step2)
    {
        this.Step1 = step1;
        this.Step2 = step2;
    }
}

Мой контроллер (при запуске страницы):

public ActionResult Create()
{
    CreateStep1 step1=FillStep1();
    CreateStep2 step2 = FillStep2();
    CreateAllStep allStep = new CreateAllStep(step1, step2);
    return View(allStep);
}

Мой контроллер (когда я нажимаю на кнопку, я хочу отправить модель):

    [HttpPost]
    public ActionResult Create(String btn, CreateAllStep form)
    {
        if (Request.IsAjaxRequest())
        {
            if (btn != null)
            {
                if (btn == "Step1")
                {
                    return PartialView("Step1",form.Step1);//not work
                }
                else if (btn == "Step2")
                {
                    return PartialView("Step2");//work
                }
                else if(btn =="AllStep")
                {
                    return PartialView("AllStep");
                }
            }
        }
        return View();
    }

И мой главный вид:

    @model SiteWebEmpty.Models.CreateAllStep
@{
    ViewBag.Title = "Title";
}
<script type="text/javascript">
    $(function () {
        $('form').submit(function () {
            $.post(this.action, $(this).serialize(), function (data) {
                alert(data);
            });
            return false;
        });
    });
</script>

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

<h2>Title</h2>
@using (Ajax.BeginForm("Create", //controller action name
"CreateStep", //controller name
new AjaxOptions //ajax options that tell mvc how to perform the replacement
{
    UpdateTargetId = "ViewPage", //id of div to update
    HttpMethod = "Post" //how to call the controller action    
}, new { id = "FormName" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
    <legend>Create </legend>
    <button type="submit" name="btn" value="Step1" id="Step1">Step 1</button>
    <button type="submit" name="btn" value="Step2" id="Step2">Step 2</button>
    <button type="submit" name="btn" value="AllStep" id="AllStep">All Step</button>

    <div id="ViewPage">
    @Html.Partial("Step1", Model)
    </div>        
    </fieldset>    
}

Мой частичный вид:

@model SiteWebEmpty.Models.ArticleRequest.CreateArticle.ArticleRequestDisplayCreateAllStep

<fieldset>
<legend>Step 1</legend>
                @Html.LabelFor(step1 => step1.Step1.Customer)
                @Html.EditorFor(step1 => step1.Step1.Customer)
                @Html.ValidationMessageFor(step1 => step1.Step1.Customer)

                @Html.LabelFor(articleType => articleType.Step1.ArticleType)
                @Html.DropDownList("ArticleType", Model.Step1.ArticleType)
                @Html.ValidationMessageFor(articleType => articleType.Step1.ArticleType)

                @Html.LabelFor(model => model.Step1.LabelType)
                @Html.DropDownList("LabelType", Model.Step1.LabelType)
                @Html.ValidationMessageFor(model => model.Step1.LabelType)
</fieldset>

сделать HTML:

<script src="/Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript"></script>
<h2>Title</h2>
<form action="/CreateStep/Create?Length=13" data-ajax="true" data-ajax-method="Post" data-ajax-mode="replace" data-ajax-update="#ViewPage" id="FormName" method="post">    <fieldset>
    <legend>Create </legend>
    <button type="submit" name="btn" value="Step1" id="Step1">Step 1</button>
    <button type="submit" name="btn" value="Step2" id="Step2">Step 2</button>
    <button type="submit" name="btn" value="AllStep" id="AllStep">All Step</button>

    <div id="ViewPage">

<fieldset>
<legend>Step 1</legend>
                <label for="Customer">Customer</label>
                <input class="text-box single-line" data-val="true" data-val-required="Customer is required" id="Customer" name="Customer" type="text" value="" />
                <span class="field-validation-valid" data-valmsg-for="Customer" data-valmsg-replace="true"></span>

                <label for="ArticleType">Article Type</label>
                <select data-val="true" data-val-required="ArticleType is required" id="ArticleType" name="ArticleType"><option value="127">AR1 : New Product</option>
<option value="161">AR2 : Product Modification</option>
</select>
                <span class="field-validation-valid" data-valmsg-for="ArticleType" data-valmsg-replace="true"></span>

                <label for="LabelType">Label Type</label>
                <select data-val="true" data-val-required="LabelType is required" id="LabelType" name="LabelType"><option value="129">Private Label</option>
</select>
                <span class="field-validation-valid" data-valmsg-for="LabelType" data-valmsg-replace="true"></span>
</fieldset>

    </div>        
    </fieldset>    
</form>

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

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Не могли бы вы опубликовать окончательный HTML-код?

Я думаю, что ваш @ Html.Partial ("Step1", Model.Step1) будет отображать входной текст с идентификатором типа Customer или ArticleType вместо Step1.Customer иStep1.ArticleType.То, что будет привязано к CreateAllStep.Customer, который не существует.

Если у вас есть Заголовки, отправленные браузерами, тоже поможет.

Обновление: измените ваш частичный Шаг 1, чтобы принятьМодель CreateAllStep и повторите попытку

0 голосов
/ 20 марта 2012

Попробуйте удалить ваш конструктор в ViewModel:

public CreateAllStep(CreateStep1 step1, CreateStep2 step2)
{
    this.Step1 = step1;
    this.Step2 = step2;
}

И изменить код контроллера на:

public ActionResult Create()
{
    CreateAllStep allStep = new CreateAllStep{Step1 = FillStep1(), Step2 = FillStep2()};
    return View(allStep);
}

У меня возникли проблемы с конструкторами с параметрами при привязке данных.

...