2012-03-20 31 views
1

我有问题将我的模型发送到我的控制器中。 我使用ajax按钮来改变页面,但我需要模型谁是第一页到第二页。 我想在我的控制器中发送我的模型,但它不起作用。我无法在我的控制器中发送我的模型

当我进入页面CreateAll时,renderpartial跟着工作来显示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> 

感谢您的帮助:)!

+0

@Martin如果我删除了我的所有构造函数,那不是工作:s – Zoners 2012-03-20 13:08:36

+0

@Fujiy我更新了我的帖子,更多的说明:)如果你需要某些东西来理解我的问题,打电话给我:)而且我不明白当你说“ @ Html.Partial(“Step1”,Model.Step1)将呈现一个带有Customer或ArticleType等id的输入文本,而不是Step1.Customer和Step1.ArticleType。 – Zoners 2012-03-20 13:09:34

+0

我更新我的答案来修复你的bug – Martin 2012-03-20 13:12:34

回答

1

你能发布最终的HTML吗?

我认为您的@ Html.Partial(“Step1”,Model.Step1)将呈现一个带有像Customer或ArticleType这样的id的输入文本,而不是Step1.Customer和Step1.ArticleType。什么将绑定到不存在的CreateAllStep.Customer。

如果你有浏览器发送的头文件也会有帮助。

更新:改变你的局部第一步,接受CreateAllStep型号,然后再试一次

+0

是可以保持“列表”,我使用下拉的其他字段来保持用户的选择,但我想保留所有“列表”。如果用户回来一步,我已经在列表在内存中? – Zoners 2012-03-21 13:50:10

+0

在我的控制器中step2 in allstep等于always null:/但step1在allstep没关系。如果我在我的控制器中删除html.Partial(“Step1”,Model)之后在我的控制器中allstep等于null到step1和step2 – Zoners 2012-03-21 18:47:51

0

尝试在您的视图模型删除你的构造:

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); 
} 

当数据绑定时,我遇到了带参数的构造函数的问题。

+0

他肯定应该有一个没有参数的构造函数。 – ZippyV 2012-03-20 13:08:28

+0

@ZippyV - 为什么?他不需要一个。 ViewModels是DTO ...我的ViewModel中没有任何构造函数。 – Martin 2012-03-20 13:12:11

+0

@Martin为什么这是一个问题,如果我有一个构造函数个性化?我删除我的构造函数,并更改我的控制器,但如果我点击按钮它是同样的事情,我不发送控制器中的模型 – Zoners 2012-03-20 13:19:16

相关问题