2011-11-19 15 views
2

我在强类型视图中获得了MVC 3表单,其中我需要提交的字段之一是在jQuery对话框中。我无法将此字段作为提交的POST参数的一部分。为什么哦为什么?如何在MVC中的隐藏对话框中提交一个字段3

观:

@model My.Models.DialogFieldModel 
@{ 
    ViewBag.Title = "Index"; 
} 

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#aDialog').dialog({ 
      autoOpen: true, 
      height: 250, width: 400, 
      modal: true, 
      buttons: { 
       "Ok!": function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 

    }); 
</script> 

<h2>Index</h2> 

@using (Html.BeginForm("PostDialogField", "DialogField")) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 

     @Html.HiddenFor(m => m.ID) 
     @Html.DisplayFor(m => m.message) 

     <div id="aDialog"> 
      <h3>Fill in this message!</h3> 
      <div class="editor-field"> 
       @Html.EditorFor(m => m.message) 
      </div> 
     </div> 

     <p><input type="submit" value="Submit Message" /></p> 

    </fieldset> 
} 


模型:

using System; 

namespace My.Models 
{ 
    public class DialogFieldModel 
    { 
     public int ID { get; set; } 
     public String message { get; set; } 

     public DialogFieldModel() 
     { 
      message = "Default"; 
     } 
    } 
} 


控制器:

using System; 
using System.Web; 
using System.Web.Mvc; 
using WellTrkd.Models; 

namespace My.Controllers 
{ 
    public class DialogFieldController : Controller 
    { 
     public ActionResult Index() 
     { 
      DialogFieldModel dfm = new DialogFieldModel(); // set default message 
      return View(dfm); 
     } 

     [HttpPost] 
     public ActionResult PostDialogField(DialogFieldModel dfm) 
     { 
      String message = dfm.message; 
      if (message != "Default") 
       //Yay! 
       return RedirectToAction("Index"); 
      else // Boo 
       return RedirectToAction("Index"); 
     } 

    } 
} 


不幸的是,除非我将它从对话框中取出,否则绝不会将#message字段与HTML POST参数的其余部分(在chrome dev视图的网络选项卡中选中)一起提交。结果是在PostDialogField操作中,即使我在对话框中更改了消息,dfm.message也包含“默认”字符串。

我知道我可以将隐藏字段添加到与对话框中的字段保持同步的窗体,但我觉得我错过了一些东西。任何想法哦明智的?

+1

什么类型是消息字段?一个布尔? – Dallas

+1

如果你使用的是强类型视图,你确定'ID'被填充,因为它听起来像一个创建视图,当你插入一个新记录时'ID'将是空的 – Rafay

+0

@达拉斯我编辑我的问题来指定消息字段是相应模型中的字符串。我希望将该字段标记为Datatype.MultilineText并将其显示为textarea。 –

回答

1

你的问题是,你变成一个对话框的元素将被移出表单向DOM底部的一个新的对话框元素。而且由于它不再是表单的一部分,所以在提交表单时不会提交。

如果您在关闭对话框时将其摧毁,它会移回到原来的位置,但我无法看到这是否是您所期望的。另一种选择是同步元素。

+0

你是对的,对话框被移出窗体,不知道我是如何错过的:)在'OK!'销毁$(this).dialog(“destroy”)。按钮不会将其移回窗体内。我想同步一个隐藏的领域是唯一的选择? –