如何从Ajax.BeginForm而不仅仅是selectedId发布完整的DropDownList

时间:2011-08-21 20:39:40

标签: c# asp.net-mvc-3 razor unobtrusive-javascript

//Model
public class SelectModel
{
    public string CategoryId { get; set; }
    public List<SelectListItem> List { get; set; }
}

//ViewModel
public class ViewModel
{
    public SelectModel SelectMod { get; set; }
}

//OnIndex call
@Html.Partial("ViewUserControl1", Model.SelectMod)

//ViewUserControl1.cshtml
@model MvcApplication4.Models.SelectModel
<div id="formid">
    @using (Ajax.BeginForm("Index1", "Home", new AjaxOptions { UpdateTargetId = "formid" }, new { id = "TheForm" }))
    { 
        @Html.DropDownListFor(x => x.CategoryId, Model.List, "--Select One--")
        <input type="submit" name="name" value="Submit" />
    }
</div>

//Controller
 public ActionResult Index1(SelectModel sm)
 {
     return PartialView("ViewUserControl1", sm);
 }

所以现在当你发布Ajax.BeginForm时,我们得到了表单的selectedId而不是FULL DROPDOWN LIST。 如果我有很多下拉列表,我需要使用完整下拉列表再次创建sm。 有没有办法我可以将整个下拉列表发送到控制器并返回相同的。

更新 不应该在AjaxOptions中有一个参数,它允许我们发布页面的完整列表(如果需要)以及selectedIds。

1 个答案:

答案 0 :(得分:1)

简短的回答是否定的!由于HTML中的下拉列表不会返回其所有成员,只返回选定的成员。

更长的答案是,ASP.NET WebForms允许您执行您所要求的操作,并且您可以通过创建与ASP.NET WebForms中的ViewState类似的机制来重新创建其中一些。

ASP.NET WebForms所做的是它将页面中列表中的所有值存储两次。两者都在显示列表中,也是一个名为ViewState的隐藏字段中的副本。然后隐藏字段在提交时发送回服务器并用于重新填充下拉列表。

您可以模仿ASP.NET WebForms在MVC中使用的相同行为,方法是以某种方式序列化您的集合并将其置于隐藏字段中。然后在提交时,您可以将隐藏字段中的数据反序列化回集合中,并使用它来填充下拉列表。