//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。
答案 0 :(得分:1)
简短的回答是否定的!由于HTML中的下拉列表不会返回其所有成员,只返回选定的成员。
更长的答案是,ASP.NET WebForms允许您执行您所要求的操作,并且您可以通过创建与ASP.NET WebForms中的ViewState类似的机制来重新创建其中一些。
ASP.NET WebForms所做的是它将页面中列表中的所有值存储两次。两者都在显示列表中,也是一个名为ViewState的隐藏字段中的副本。然后隐藏字段在提交时发送回服务器并用于重新填充下拉列表。
您可以模仿ASP.NET WebForms在MVC中使用的相同行为,方法是以某种方式序列化您的集合并将其置于隐藏字段中。然后在提交时,您可以将隐藏字段中的数据反序列化回集合中,并使用它来填充下拉列表。